C# ef核心忽略导航属性

C# ef核心忽略导航属性,c#,entity-framework-core,ef-fluent-api,ef-core-2.0,navigation-properties,C#,Entity Framework Core,Ef Fluent Api,Ef Core 2.0,Navigation Properties,我有一个实体User,它有两个属性CreatedBy和UpdatedBy都引用User。默认情况下,EF假设这两个变量是一对一的关系。我收到以下错误消息: 消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/依赖方。要标识关系的子/依赖方,请配置外键属性。如果这些导航不应属于同一关系的一部分,请在不指定反向的情况下对其进行配置。有关更多详细信息,请参阅 目前,我有一门课是这

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

消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/依赖方。要标识关系的子/依赖方,请配置外键属性。如果这些导航不应属于同一关系的一部分,请在不指定反向的情况下对其进行配置。有关更多详细信息,请参阅

目前,我有一门课是这样的:

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; }

}
基本上,以下是我正在尝试的:

  • 创建和更新的属性彼此之间没有关系(不需要导航/反向属性)
  • 任何数量的用户都可以拥有相同的
    CreatedBy
    ,任何数量的用户都可以拥有相同的
    UpdatedBy
如何让EF忽略导航属性?我有
CreatedBy
的主要原因是我以后可以使用
Include(u=>u.CreatedBy)
。我知道使用
IEnumerable AllCreatedUsers
属性可以解决这个问题,但我不想为实体中的每个属性创建
IEnumerable
。有什么方法可以用fluentapi做到这一点吗

以下是我尝试过的:

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

modelBuilder.Entity<User>().HasOne(u => u.CreatedBy)
                                .WithMany(u => EF.Property<IEnumerable<User>>(u, "AllCreatedUsers"));
modelBuilder.Entity()
.财产(“AllCreatedUsers”);
modelBuilder.Entity().HasOne(u=>u.CreatedBy)
.with many(u=>EF.Property(u,“AllCreatedUsers”);
您需要使用无参数
和多个方法重载来配置两个关系:

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

modelBuilder.Entity<User>()
    .HasOne(u => u.UpdatedBy)
    .WithMany(); 
modelBuilder.Entity()
.HasOne(u=>u.CreatedBy)
.有许多();
modelBuilder.Entity()
.HasOne(u=>u.UpdatedBy)
.有许多();

您可以为这两个属性添加
ForeignKey
数据注释

public class User
{
    public int Id { get; set; }

    public int? CreatedById { get; set; }
    [ForeignKey("CreatedById")]
    public User CreatedBy { get; set; }

    public int? UpdatedById { get; set; }
    [ForeignKey("UpdatedById")]
    public User UpdatedBy { get; set; }
}

尝试在
UpdatedBy
CreatedBy
上使用
ForeignKey
数据注释,为什么您希望EF在添加导航属性时忽略它,这样您就有了EF的导航属性?@viveknuna yes。。我在注解和流畅中尝试了
ForeignKey
API@Progman考虑到我永远不会使用这样的
IEnumerable
,在一个类中有这么多未使用的属性是没有意义的。@viveknuna-yep。再次尝试
ForeignKey
成功。上次我可能只对一个属性使用了fk。这两种方法都有效。我之前已经试过了。我甚至试过用拷贝粘贴你的代码。这仍然是相同的结果,我可以说,这是处理此类模型的方法。如果你创建了一个干净的新项目,从问题中复制/粘贴
User
类,从答案中复制/粘贴fluent配置,你会看到它是有效的。是的,刚刚测试过,它在干净的项目中工作得很好。然而,可能有一些特殊的情况,这是不考虑的。vivek的代码似乎在这两种情况下都有效。这对我来说没有任何意义。FK实际上与问题无关(如果它们不符合约定,我可以将它们包含在fluent设置中),并且在EF Core中数据注释是绝对不必要的(我会说是过时的)。