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

Posted

技术标签:

【中文标题】“Company.Model.User”类型和“Company.Core.Model.User”类型都具有相同的简单名称“User”,因此不能在同一模型中使用【英文标题】:The type 'Company.Model.User' and the type 'Company.Core.Model.User' both have the same simple name of 'User' and so cannot be used in the same model 【发布时间】:2013-09-09 10:19:47 【问题描述】:

我有一个基本实体类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 以从模型中显式排除属性或类型。

这个link 表示你不能在模型中有两次相同的“简单名称”。

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

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

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

【问题讨论】:

我正在与同样的事情作斗争。你找到解决方案了吗? @JasonCragun 不幸的是没有。我只是将基类重命名为 UserBase。 此问题已在 EF Core 中修复。 【参考方案1】:

初读Table type mappings

首先需要了解分层实现模型选项。 然后查看 IGNORE 选项。您可能需要也可能不需要,具体取决于所选的方法。 需要忽略???

modelBuilder.Ignore<BaseXYZ>()

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

【讨论】:

我已经尝试了您的两个建议。忽略基类没有任何效果,我仍然遇到同样的错误。同样,将基本 User 类更改为抽象类也没有影响。【参考方案2】:

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

【讨论】:

哇,刚好碰到这个。这是一个相当大的限制。几乎消除了有界上下文的整个 DDD 概念 对我来说非常烦人的限制。经过多年试图说服自己使用 EF 而不是 NH,现在被这个问题所困扰。 今天我自己打这个。我有一个系统,其中包含两种完全不相关的采购订单,都称为PurchaseOrder。因此,我需要重命名我的一个类。不高兴。 更糟糕的是,即使它们在不同的模式中,表名也不能相同。 OM.PurchaseOrderMM.PurchaseOrder 被 EF 弄糊涂了,它认为他们试图共享同一张桌子。把它放在一起,MS。 这已在 2013 年 10 月得到解决。" 这是我们希望在 EF6 之后解决的问题,以便 EF 可以使用具有相同简单名称的任意数量的类型,只要它们具有不同的命名空间或外部类型”。在我看来,在 EF7 之前解决这个问题会更重要吗? blog.oneunicorn.com/2013/03/11/…【参考方案3】:

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

【讨论】:

之所以有派生类,是为了尽量减少实体映射的重复。

以上是关于“Company.Model.User”类型和“Company.Core.Model.User”类型都具有相同的简单名称“User”,因此不能在同一模型中使用的主要内容,如果未能解决你的问题,请参考以下文章

自定义 C 类型与 C 类型列表和列表类型

c语言中构造类型有几种?分别是啥?

C/C++ 数据类型

C指针(2):指针的长度和类型

C语言类型的自动转换时,啥类型能转换成啥类型呀?、嘿嘿,比如类型和decimal类型混合在一个表达

C 和派生数据类型?