让我试着以简单的方式解释这一点。
我有这个:
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 根据惯例相信一个字段是反向导航属性(因为实体类型,在这种情况下)。
任何帮助?
答案 0 :(得分:1)
配置不带反向属性的关系,指定外键字段的名称:
modelBuilder.Entity<User>().HasMany(u => u.Histories).WithRequired().Map(m => m.MapKey("User_Id"));