2014-09-19 83 views
0

让我试着用简单的方式来解释这一点。告诉modelBuilder不要假设财产是逆向导航财产

我有这样的:

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

注意EntityTrackHistory也作为对其他实体的ICollection:这是包含在我User表这样

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

现在建立我的数据库后,我得到*_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是不同的“用户”。

但是,我根本不打算使用该导航属性(意思是说,每次访问EntityTrackHistory时,我都会从原始实体执行此操作),并且我想告诉EF ModifiedBy不应该是逆导航属性。

在我的脑海里,'解决方案'不起作用,因为我修改我的实体只是为了解决EF部分的一些约定(我的模型应该是EF-agnostic)。

我发现如何(在这种情况下,或反的,等等)映射属性和导航属性的信息,但我还没有找到如何告诉EF 相信一个字段是一个反向信息导航属性只是按照约定(因为在这种情况下的实体类型)。

任何帮助?

回答

1

配置不逆属性指定的外键字段的名称之间的关系:

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

作品!谢谢 – Jcl 2014-09-19 10:00:31