Тип «Company.Model.User» и тип «Company.Core.Model.User» имеют одинаковое простое имя «Пользователь» и поэтому не могут использоваться в одной модели

ef-code-first entity entity-framework entity-framework-6 inheritance

Вопрос

У меня есть базовый объект класса 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 User
{
    public string Username { get; set; }
    public string Usercode { get; set; }
}

В отдельной сборке у меня есть производный класс MyCompany.Model.User который наследуется от базового класса User и расширяет его с помощью некоторых дополнительных свойств:

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

Кроме того, у меня есть производный класс сопоставления MyCompany.Model.UserMap чтобы предоставить дополнительную конфигурацию для дополнительных свойств:

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

Однако при добавлении MyCompany.Model.User в контекст и регистрации MyCompany.Model.UserMap я получаю следующую ошибку:

Тип «MyCompany.Model.User» и тип «MyCompany.Core.Model.User» имеют одинаковое простое имя «Пользователь» и поэтому не могут использоваться в той же модели. Все типы в данной модели должны иметь уникальные простые имена. Используйте «NotMappedAttribute» или вызовите Ignore в Code First fluent API, чтобы явно исключить свойство или тип из модели.

Эта ссылка указывает, что вы не можете иметь одно и то же «простое имя» в модели дважды.

Почему базовый класс «простое имя» регистрируется в модели, и есть ли способ обойти его для реализации такого рода наследования объектов?

Я подозреваю, что простым решением было бы переименовать производный класс; однако я бы предпочел избежать этого, поскольку в разных контекстах может быть много образований.

Примечание. Использование Entity Framework 6.0.0-rc1 (preerelease)

Принятый ответ

Это ограничение EF, о котором я сообщал в 2012 году https://entityframework.codeplex.com/workitem/483, который до сих пор не реализован в 6.0.2. EF использует плоскую внутреннюю архитектуру и не распознает пространства имен. Может быть, в EF7, но не раньше. На данный момент единственными решениями являются переименование двух классов в имена уникальных классов независимо от пространства имен, в котором они находятся. IMHO, это существенное ограничение в EF. Просто рассмотрите класс с именем Category и сколько разных пространств имён можно использовать внутри домена.


Популярные ответы

Сначала прочитанные сопоставления типа таблицы

Сначала следует понимать варианты иерархической реализации. Затем просмотрите опцию IGNORE. Вы можете или не нуждаться в зависимости от выбранного подхода.
требуется игнорировать ???

modelBuilder.Ignore<BaseXYZ>()

В настоящее время Ef пытается включить ваш базовый класс для поддержки включенного типа, который наследуется от абстрактного класса NON.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему