繁体   English   中英

没有声明外键的导航属性

[英]Navigation Property without Declaring Foreign Key

我的所有模型至少包含两个关联。 在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的情况下创建这两个关系,我认为你必须在模型中引入关联的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配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM