11

使用代码优先实体框架和 .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。如果让子级包含对其父级的引用(示例),则执行此操作的正常方法。

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

4

1 回答 1

20

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

更改此设置后,在您的特定示例中,您无需执行任何操作,因为外键属性名称遵循约定(ParentId主体实体中的主键名称Parent),因此 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]需要外键属性所在的依赖实体中的导航属性。

于 2012-07-05T20:18:40.283 回答