【发布时间】: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