我有关于多对多关系的导航属性的问题。
正如我在MSDN上阅读的那样,可以选择为导航属性定义ForeignKey
属性。现在我想将这种特性用于多对多关系,但我无法让它发挥作用。
我使用的是EF 6.1.3。
我的课程:
public class Class1
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[ForeignKey(nameof(Class2s))]
public ICollection<Guid> Class2Ids { get; set; }
[ForeignKey(nameof(Class2Ids))]
public ICollection<Class2> Class2s { get; set; }
[ForeignKey(nameof(Class3))]
public Guid Class3Id { get; set; }
public Guid Class3 { get; set; }
}
public class Class2
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[ForeignKey(nameof(Class1s))]
public ICollection<Guid> Class1Ids { get; set; }
[ForeignKey(nameof(Class1Ids))]
public ICollection<Class1> Class1s { get; set; }
}
public class Class3
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
}
导航属性加载但id集合保持为空的问题。
public static void Main(string[] args)
{
using (SomeContext context = new SomeContext())
{
var classes = context.Classe1Set
.Include(c => c.Class2s)
.Include(c => c.Class2s)
.First();
classes.Class3; // filled with correct object
classes.Class3Id; // filled with correct guid
classes.Class2s; // is filled with 2 elements
classes.Class2Ids; // problem: is Empty List
}
}
我做错了什么?
编辑:更新了类以更好地表示问题。在DB端正确创建多对多连接。问题是 Class1Ids 属性无法正确填充,而 Class3Id 则无法填充。
感谢您的帮助。
答案 0 :(得分:0)
您不需要ForeignKey属性 - 将从类型推断出关系
Class1Ids
和Class2Ids
不指向其他实体,不是导航属性,也不能由EF自动加载。
为了得到你想要的东西你应该像这样定义Ids属性
public ICollection<Guid> ClassXIds { get { return ClassXs.Select(c => c.Id).ToList(); } }
。这不会从DB加载数据,只需从导航属性中提取Id。
答案 1 :(得分:0)
Class1类下面应该有Class2的集合导航属性,而Class2应该有Class1的集合导航属性,它将在Class1和Class2之间创建多对多关系,如下所示:
public class Class1
{
public Class1()
{
this.Courses = new HashSet<Course>();
}
public int Class1Id { get; set; }
public virtual ICollection<Class2> Class2s { get; set; }
}
public class Class2
{
public Class1()
{
this.Class1s = new HashSet<Class1>();
}
public int Class2Id { get; set; }
public virtual ICollection<Class1> Class1s { get; set; }
}
然后,您将在数据库中获得一个名为Class1Class2
的表,其中字段Class1_Class1Id作为主键,另一个Class2_Class2Id作为主键
默认情况下,EF将查找与主体实体主键名称相同的外键属性。 如果外键属性不存在,则EF将在Db表中使用+&#34; _&#34;创建FK列。 + 例如如果Class1实体不包含Class1包含Class1Id的Class1的foreignkey属性,EF将在Class1表中创建Class1_Class1Id外键列