告诉modelBuilder不要假设属性是反向导航属性

时间:2014-09-19 09:15:26

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

让我试着以简单的方式解释这一点。

我有这个:

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包含在其他实体上。

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

但是,由于其中一个表是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是不同的&#34;用户&#34;。

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

在我的脑海中,解决方案&#39;不起作用,因为我修改我的实体只是为了解决EF部分的一些惯例(我的模型应该是EF不可知的)。

我找到了有关如何映射属性和导航属性的信息(或反向的,如本例所示),但我还没有找到有关如何告知EF NOT 根据惯例相信一个字段是反向导航属性(因为实体类型,在这种情况下)。

任何帮助?

1 个答案:

答案 0 :(得分:1)

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

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