ef 核心忽略导航属性

Nev*_*ane 4 c# navigation-properties entity-framework-core ef-fluent-api ef-core-2.0

我有一个实体User,它有两个属性CreatedBy并且UpdatedBy都引用User. 默认情况下,EF 假定这两者是一对一的关系。我收到以下错误消息:

消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/从属端。要识别关系的子/依赖方,请配置外键属性。如果这些导航不应该是同一关系的一部分,请在不指定反向的情况下配置它们。有关更多详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=724062

目前,我有一个这样的课程:

public class User
{

    public int Id { get; set; }

    public int? CreatedById { get; set; }
    public User CreatedBy { get; set; }

    public int? UpdatedById { get; set; }
    public User UpdatedBy { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

基本上,这就是我正在尝试的:

  • created 和 updated 彼此没有关系(不需要导航/反向属性)
  • 任意数量的用户都可以拥有相同的CreatedBy,任意数量的用户都可以拥有相同的UpdatedBy

我怎样才能让 EF 忽略导航属性?我拥有的主要原因CreatedBy是我Include(u => u.CreatedBy)以后可以使用。我知道使用IEnumerable<User> AllCreatedUsers属性可以解决这个问题,但我不想为IEnumerable我的实体中的每个创建一个。有没有办法用流畅的 API 做到这一点?

这是我尝试过的:

modelBuilder.Entity<User>()
                .Property<IEnumerable<User>>("AllCreatedUsers");

modelBuilder.Entity<User>().HasOne(u => u.CreatedBy)
                                .WithMany(u => EF.Property<IEnumerable<User>>(u, "AllCreatedUsers"));
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

您需要使用无参数方法重载来配置两个单一导航属性关系WithMany

modelBuilder.Entity<User>()
    .HasOne(u => u.CreatedBy)
    .WithMany();

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