35

我有一个基本实体类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”,因此不能在同一模型中使用。给定模型中的所有类型都必须具有唯一的简单名称。在 Code First fluent API 中使用“NotMappedAttribute”或调用 Ignore 以从模型中显式排除属性或类型。

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

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

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

注意:使用实体框架 6.0.0-rc1(预发布)

4

3 回答 3

46

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

于 2014-03-17T22:01:40.630 回答
4

先读表类型映射

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

modelBuilder.Ignore<BaseXYZ>()

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

于 2013-09-05T15:09:44.190 回答
0

为了保持相同的类名,我建议使用不同的接口。定义通用属性的 Core.Entity 接口和用于额外属性的其他接口。因此,不要使用派生类,而是使用实现这两个接口的类。

于 2016-01-28T09:33:17.573 回答