繁体   English   中英

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

[英]EF One-to-many Foreign Keys without child navigation properties

使用代码优先的实体框架和.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; }
}

正如这里所指出的,为了将外键关系带入数据库,必须链接实际对象,而不仅仅是它们的ID。 如果子项包含对其父项的引用( 示例 ),则执行此操作的常规方法。

但是,如何在我的实现中强制执行外键,这是另一种方式(父引用子代)?

首先:您不能将IEnumerable<T>用于集合导航属性。 EF将忽略此属性。 请改用ICollection<T>

更改后,在您的特定示例中,您不需要执行任何操作,因为外键属性名称遵循约定(主体实体Parent的主键ParentId名称),以便EF将检测所需的一对多关系ParentChild自动。

如果您有另一个“非常规”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]属性的使用需要外键属性所在的从属实体中的导航属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM