使用代码优先 Entity Framework 和 .NET 4,我试图在父子之间创建一对多关系:
public class Parent
{
[Key]
public int ParentId { get; set; }
[Required]
public string ParentName { get; set; }
public IEnumerable<Child> Children { get; set; }
}
public class Child
{
[Key]
public int ChildId { get; set; }
[ForeignKey]
public int ParentId { get; set; }
[Required]
public string ChildName { get; set; }
}
正如指出的那样here ,为了将外键关系带入数据库,必须链接实际对象,而不仅仅是它们的 ID。如果子项包含对其父项 (example) 的引用,则执行此操作的正常方法。
但是我如何在我的实现中强制执行外键,这是相反的方式(父引用子)?
最佳答案
首先:您不能使用 IEnumerable<T>
对于集合导航属性。 EF 将忽略此属性。使用 ICollection<T>
相反。
更改此设置后,在您的特定示例中,您无需执行任何操作,因为外键属性名称遵循约定(主键名称 ParentId
在主体实体 Parent
中),以便 EF 检测Parent
之间必需的一对多关系和 Child
自动。
如果您有另一个“非常规”的 FK 属性名称,您仍然可以使用 Fluent API 定义这样的映射,例如:
public class Child
{
[Key]
public int ChildId { get; set; }
public int SomeOtherId { get; set; }
[Required]
public string ChildName { get; set; }
}
映射:
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithRequired()
.HasForeignKey(c => c.SomeOtherId);
据我所知,不可能用数据注释来定义这种关系。 [ForeignKey]
的用法属性需要外键属性所在的依赖实体中的导航属性。
关于c# - 没有子导航属性的 EF 一对多外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11350517/