c# - 没有子导航属性的 EF 一对多外键

标签 c# entity-framework foreign-keys code-first

使用代码优先 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/

相关文章:

c# - 如何从 Asp.Net Identity 表中删除鉴别器列

c# - 在 SQLite 中启用外键约束

c# - 在 C# 中使用 byte/short 等的任何理由?

c# - 通过命令行启动apache tomcat-Window Services时设置端口号

c# - 当我注销并单击浏览器后退按钮时,我仍然可以在 MVC4 应用程序中创建、编辑和删除用户

mysql - 添加外键时报错 'Table ' .\schema\table' already exists

mysql - 如何将表与许多其他表之一关联起来?

c# - DataTable.Select() 中的子字符串测试

c# - 如何测试使用 DbEntityValidationException 的异常扩展方法?

entity-framework - 是否可以在构造最终 SQL 时强制 EF(Code First)忽略派生类型