我的所有模型都至少包含两个关联。当在ef4中建模时,我只能通过使用流畅接口在没有第二个外键属性的情况下做到这一点。ForeignKey似乎是正确的属性,除了它需要一个字符串参数。
所以我的问题是,你可以有一个导航属性并使用属性来声明它吗?
public class User : IAuditable
{
// other code
public virtual User Creator { get; set; }
public virtual User Modifier { get; set; }
}
我认为,仅用数据属性来定义关系是不可能的。问题是EF的映射约定假设Creator
和Modifier
是同一关系的两端,但不能确定这种关联的主体和从属是什么。据我所见,在支持的属性列表中,没有选项可以用数据注释来定义主端和依赖端。
Creator
和Modifier
之间的关系实际上是无意义的-从语义的角度来看)
在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; }
}
我假设这里需要Creator
和Modifier
,否则我们可以省略[Required]
属性。
我认为这是一个很明显的例子,使用Fluent API很有意义,比修改模型更好,只是为了避免Fluent配置。