不声明外键的导航属性



我的所有模型都至少包含两个关联。当在ef4中建模时,我只能通过使用流畅接口在没有第二个外键属性的情况下做到这一点。ForeignKey似乎是正确的属性,除了它需要一个字符串参数。

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

public class User : IAuditable
{
    // other code
    public virtual User Creator { get; set; }
    public virtual User Modifier { get; set; }
}

我认为,仅用数据属性来定义关系是不可能的。问题是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,我认为你必须在模型中引入关联的多个端点,如下所示:

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配置。

相关内容

  • 没有找到相关文章

最新更新