我的所有模型都至少包含两个关联。在 ef4 中对此进行建模时,我只能通过使用流畅的接口在没有第二个外键属性的情况下做到这一点。 foreignKey 似乎是正确使用的属性,除了它需要一个字符串参数这一事实。
所以我的问题是,您可以拥有一个导航属性并使用属性来声明它吗?
public class User : IAuditable
{
// other code
public virtual User Creator { get; set; }
public virtual User Modifier { get; set; }
}
我认为,仅用数据属性来定义关系是不可能的。问题是 EF 的映射约定假设Creator
and Modifier
是同一关系的两端,但无法确定该关联的主体和从属关系。据我在支持的属性列表中看到,没有选项可以使用数据注释来定义主体和从属端。
除此之外,我猜你实际上想要两种关系,两者的末端均未在模型中暴露。这意味着您的模型在映射约定方面是“非常规的”。 (我认为之间的关系Creator
and 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
and Modifier
是必需的,否则我们可以省略[Required]
属性。
我认为这是一个明显的例子,使用 Fluent API 很有意义,并且比仅仅为了避免 Fluent 配置而修改模型更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)