【问题标题】:ef core ignore navigation propertyef core 忽略导航属性
【发布时间】:2018-10-22 12:55:00
【问题描述】:

我有一个实体User,它有两个属性CreatedByUpdatedBy 都引用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; }

}

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

  • 创建的和更新的不会相互关联(不需要导航/反向属性)
  • 任何数量的用户都可以拥有相同的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"));

【问题讨论】:

  • 尝试在UpdatedByCreatedBy上使用ForeignKey数据注释
  • 为什么要 EF 在添加导航属性时忽略它,以便拥有 EF 的导航属性?
  • @viveknuna 是的.. 我在注释和流畅的 API 中尝试了 ForeignKey
  • @Progman 考虑到我永远不会使用这样的IEnumerable,所以在一个类中拥有这么多未使用的属性是没有意义的。
  • @viveknuna 是的。再次尝试ForeignKey 工作。上次我可能只将 fk 用于一个属性。两者都使用它。

标签: c# entity-framework-core ef-fluent-api ef-core-2.0 navigation-properties


【解决方案1】:

需要通过无参WithMany方法重载配置两个Single Navigation Property关系:

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

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

【讨论】:

  • 我之前试过这个。我什至尝试复制粘贴您的代码。结果还是一样
  • 我只能说这是处理这种模型的方法。如果您创建一个干净的新项目,复制/粘贴问题中的User 类和答案中的流利配置,您将看到它有效。
  • 是的,刚刚测试过,它在一个干净的项目上运行良好。但是,可能有一些特殊情况没有考虑。 @vivek 的代码似乎在这两种情况下都有效。
  • 这对我来说没有任何意义。 FK 确实与问题无关(如果它们不符合约定,我可以将它们包含在流畅的设置中),并且数据注释在 EF Core 中是绝对不必要的(我会说已经过时了)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2012-09-21
    • 2022-01-04
    • 1970-01-01
    • 2020-02-23
    相关资源
    最近更新 更多