我的数据库中有以下表格:
例
CaseTogs
TOGS
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"))
但第一个代码更简单。由于它与设计师合作,我知道这是可能的。