没有声明外键的导航属性

Dan*_*tle 31 c# mapping entity-framework 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; }
}
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 35

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

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

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

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

modelBuilder.Entity<User>()
            .HasRequired(u => u.Modifier)
            .WithMany();
Run Code Online (Sandbox Code Playgroud)

因为a 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; }
}
Run Code Online (Sandbox Code Playgroud)

我在这里假设Creator并且Modifier是必需的,否则我们可以省略该[Required]属性.

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