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

时间:2013-09-05 14:15:16

标签: entity-framework inheritance ef-code-first entity entity-framework-6

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

public class User
{
    public string Username { get; set; }
    public string Usercode { get; set; }
}

我还有一个基本映射类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");
    }
}

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

public class User : Core.User
{
    public string Surname { get; set; }
} 

此外,我还有一个派生的映射类MyCompany.Model.UserMap,以便为其他属性提供额外的配置:

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

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

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

link表示您不能在模型中使用相同的“简单名称”两次。

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

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

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

3 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:2)

首先阅读Table type mappings

首先需要了解分层实现模型选项。 然后查看IGNORE选项。根据所选择的方法,您可能需要也可能不需要 要求忽略???

modelBuilder.Ignore<BaseXYZ>()

Ef目前正在尝试包含您的基类,以支持从NON抽象类继承的包含类型。

答案 2 :(得分:0)

为了保持相同的类名,我建议使用不同的接口。 Core.Entity的接口,用于定义公共属性,另一个接口用于额外属性。因此,不使用派生类,而是使用实现两个接口的类。