如何首先使用代码创建“一对多”关系

时间:2014-11-24 20:57:38

标签: c# entity-framework-6

我的数据库中有以下表格:

  • Id(PK)

CaseTogs

  • TogId(PK,FK)
  • CaseId(FK)

TOGS

  • TogId(PK)
  • 名称

Tog和CaseTog之间存在一对一的关系(还有另一个与Togs有一对一关系的表,但对于这个问题并不重要)。 Case和CaseTogs之间存在一对多的关系。

我希望Case实体对象有一个Tog集合,这样我就可以这样做:

_entities.Cases.Where(c => c.Togs.Any(t => t.Name == "Foo"));

当我使用设计师创建模型时,它可以工作。当我首先使用代码创建模型时,它不会。我收到以下错误:

----> System.Data.SqlClient.SqlException:列名称'Case_Id'无效。

这是正在生成的sql:

SELECT 
[Extent1].[Id] AS [Id] 
FROM [cases].[Cases] AS [Extent1]
WHERE  EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[Togs] AS [Extent2]
    WHERE ([Extent1].[Id] = [Extent2].[Case_Id]) AND (N'Foo' = [Extent2].[Name])
)

以下是我用于在Code First和我的实体中设置关系的代码:

        modelBuilder.Entity<CaseTog>()
            .HasKey(ct => ct.TogId);

        modelBuilder.Entity<CaseTog>()
            .HasRequired(ct => ct.Case)
            .WithMany(c => c.CaseTogs)
            .HasForeignKey(ct => ct.CaseId);

        modelBuilder.Entity<CaseTog>()
            .HasRequired(ct => ct.Tog)
            .WithRequiredDependent(t => t.CaseTog);


[Table("dbo.Cases")]
public partial class Case
{
    public Case()
    {
        Togs = new HashSet<Tog>();
        CaseTogs = new HashSet<CaseTog>();
    }

    public virtual ICollection<CaseTog> CaseTogs { get; set; }
    public virtual ICollection<Tog> Togs { get; set; }
}

[Table("dbo.CaseTogs")]
public partial class CaseTog
{
    public int TogId { get; set; }
    public int CaseId { get; set; }

    public Case Case { get; set; }
    public Tog Tog { get; set; }
}

[Table("Togs")]
public partial class Tog
{
    [Key]
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    public virtual CaseTog CaseTog { get; set; }
    public virtual Case Case { get; set; }
}

我可以写这样的代码:

_entities.Cases.Where(c => c.CaseTogs.Any(ct => ct.Tog.Name == "Foo"))

但第一个代码更简单。由于它与设计师合作,我知道这是可能的。

0 个答案:

没有答案