【问题标题】:Tell modelBuilder not to assume property is an inverse navigation property告诉模型构建器不要假设属性是反向导航属性
【发布时间】:2014-09-19 09:15:25
【问题描述】:

让我试着用简单的方式解释一下。

我有这个:

public class EntityTrackHistory
{
  public int Id { get; set; }
  public virtual User ModifiedBy { get; set; }
  public DateTime ModifiedDate { get; set; }
}

这包含在我的User 表中,如下所示:

public class User
{
  public int Id { get; set; }
  public string Name { get; set; }
  public ICollection<EntityTrackHistory> Histories { get; set; }
}

请注意,EntityTrackHistory 也作为ICollection 包含在其他实体上。

现在,在构建我的数据库时,我得到了正确包含 EntityTrackHistory 集合的所有实体的 *_Id 字段和外键。

但是,由于其中一个表是User,因此在创建数据库时,模型构建器认为ModifiedBy 属性是User 表的反向导航属性,但事实并非如此。

解决此问题的一种方法是使用 User 名称向 User 实体添加第二个虚拟属性(使用该名称或告诉 modelBuilder 这是一个反向导航属性):

public class EntityTrackHistory
{
  public int Id { get; set; }
  public virtual User ModifiedBy { get; set; }
  public DateTime ModifiedDate { get; set; }

  public virtual User User { get; set; }
}

这可行,并且 EF 正确假定 User 是反向导航属性,ModifiedBy 是不同的“用户”。

但是,我根本不会使用该导航属性(意思是:每次我访问 EntityTrackHistory 时,我都会从原始实体开始),我想告诉 EF ModifiedBy 应该不是反向导航属性。

在我的脑海中,“解决方案”不起作用,因为我修改我的实体只是为了解决 EF 部分的一些约定(我的模型应该与 EF 无关)。

我找到了有关如何映射属性和导航属性(或反向属性,如本例中)的信息,但我还没有找到有关如何告诉 EF NOT 相信一个的信息field 只是按照惯例是一个反向导航属性(在这种情况下是因为实体类型)。

有什么帮助吗?

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    配置不带反向属性指定外键字段名的关系:

    modelBuilder.Entity<User>().HasMany(u => u.Histories).WithRequired().Map(m => m.MapKey("User_Id"));
    

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多