我对多对多关系的导航属性有疑问。
正如我在 MSDN 上阅读的那样,有一个选项可以将 ForeignKey
属性定义为导航属性。现在我想将此功能用于多对多关系,但我无法让它工作。
我正在使用 EF 6.1.3。
我的类(class):
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
}
}
我做错了什么?
编辑:更新类以更好地表示问题。多对多连接在数据库端正确创建。问题只是属性 Class1Ids 没有正确填写,而 Class3Id 可以。
感谢您的帮助。
最佳答案
您不需要 ForeignKey 属性 - 将从类型中推断出关系。
Class1Ids
和 Class2Ids
不要指向另一个实体,不是导航属性,也不能由 EF 自动加载。
要得到你想要的,你应该像这样定义 IDs 属性
public ICollection<Guid> ClassXIds { get { return ClassXs.Select(c => c.Id).ToList(); } }
.这不会从数据库加载数据,只是从导航属性中提取 ID。
关于c# - Entity Framework : foreign keys for many-to-many relations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926787/