没有声明外键的导航属性

时间:2011-04-17 05:52:12

标签: c# entity-framework mapping ef-code-first entity-framework-4.1

我的所有模型至少包含两个关联。在ef4中对此进行建模时,我只能通过使用流畅的界面在没有第二个外键属性的情况下执行此操作。 ForeignKey似乎是正确使用的属性,除了它需要一个字符串参数。

所以我的问题是,你能拥有一个导航属性并使用属性声明它吗?

public class User : IAuditable
{
    // other code

    public virtual User Creator { get; set; }

    public virtual User Modifier { get; set; }
}

1 个答案:

答案 0 :(得分:35)

我相信,不可能只与数据属性定义关系。问题是EF的映射约定假设CreatorModifier是同一个关系的两端,但不能确定该关联的主体和依赖是什么。据我所知,在支持的属性列表中,没有选项可以使用数据注释定义主体和从属端。

除此之外,我猜你实际上想要两个关系,两者都有一个未在模型中公开的结尾。这意味着您的模型在映射约定方面是“非常规的”。 (我认为CreatorModifier之间的关系实际上是无意义的 - 从语义角度来看。)

因此,在Fluent API中,您需要这样:

modelBuilder.Entity<User>()
            .HasRequired(u => u.Creator)
            .WithMany();

modelBuilder.Entity<User>()
            .HasRequired(u => u.Modifier)
            .WithMany();

因为User可以是许多其他用户记录的创建者或修饰符。正确?

如果你想在没有Fluent API且仅使用DataAnnotations的情况下创建这两个关系,我认为你必须在模型中引入关联的Many-Ends,如下所示:

public class User
{
    public int UserId { get; set; }

    [InverseProperty("Creator")]
    public virtual ICollection<User> CreatedUsers { get; set; }
    [InverseProperty("Modifier")]
    public virtual ICollection<User> ModifiedUsers { get; set; }

    [Required]
    public virtual User Creator { get; set; }
    [Required]
    public virtual User Modifier { get; set; }
}

我在此假设CreatorModifier是必需的,否则我们可以省略[Required]属性。

我认为这是一个明显的例子,使用Fluent API非常有意义,并且比修改模型更好,只是为了避免Fluent配置。