类型'Company.Model.User'和类型'Company.Core.Model.User'都具有相同的简单名称'User',因此不能在同一模型中使用

Bre*_*tin 33 inheritance entity entity-framework ef-code-first entity-framework-6

我有一个基本实体类MyCompany.Core.Model.User,用于User实体的公共属性:

public class User
{
    public string Username { get; set; }
    public string Usercode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个基本映射类MyCompany.Core.Model.UserMap来为基类设置代码的第一个映射User:

public class UserMap<TUser> : EntityMapBase<TUser>
    where TUser : User
{
    public UserMap()
    {
        // Primary Key
        this.HasKey(t => t.Usercode);

        // Table & Column Mappings
        this.ToTable("Users");
        this.Property(t => t.Username).HasColumnName("Username");
        this.Property(t => t.Usercode).HasColumnName("UserCode");
    }
}
Run Code Online (Sandbox Code Playgroud)

在一个单独的程序集中,我有一个派生类MyCompany.Model.User,User它继承自基类并使用一些其他属性扩展它:

public class User : Core.User
{
    public string Surname { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

另外,我有一个派生的映射类MyCompany.Model.UserMap,为附加属性提供额外的配置:

public class UserMap : Core.UserMap<User>
{
    public UserMap()
    {
        this.Property(t => t.Surname).HasColumnName("Surname");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当添加MyCompany.Model.User到上下文并注册时,MyCompany.Model.UserMap我收到以下错误:

类型"MyCompany.Model.User"和类型"MyCompany.Core.Model.User"都具有相同的简单名称"User",因此不能在同一模型中使用.给定模型中的所有类型都必须具有唯一的简单名称.使用'NotMappedAttribute'或在Code First Fluent API中调用Ignore以从模型中明确排除属性或类型.

链接表示您不能在模型中使用相同的"简单名称"两次.

为什么在模型中注册了基类"简单名称",为了实现这种实体继承,有没有办法绕过它?

我怀疑简单的解决方案是重命名派生类; 但我宁愿避免这种情况,因为在多个上下文中可能有许多派生.

注意:使用Entity Framework 6.0.0-rc1(预发行版)

小智 44

这是我在2012年报告的EF的限制https://entityframework.codeplex.com/workitem/483,但仍未在6.0.2中实现.EF使用扁平内部架构,无法识别名称空间.可能会进入EF7而不是之前.目前唯一的解决方案是将两个类重命名为唯一的类名,而不管它们所在的命名空间.恕我直言,这是EF中的一个重要限制.只需考虑一个名为Category的类,以及可以在域内使用多少个不同的命名空间.

  • 哇,刚刚来到这里.这是一个非常巨大的限制.几乎消除了有界上下文的整个DDD概念 (13认同)
  • 对我来说非常烦人的限制.多年来试图说服自己使用EF代替NH,现在坚持这个问题. (4认同)
  • 今天就来点击这个.我有一个系统有两种完全不相关的采购订单,都称为"PurchaseOrder".因此,我需要重命名我的一个类.不高兴. (4认同)
  • 更糟糕的是,即使表名在不同的模式中,表名也不能相同."OM.PurchaseOrder"和"MM.PurchaseOrder"被EF搞糊涂了,它认为他们正试图共享同一张桌子.把它放在一起,MS. (2认同)