Подтвердить что ты не робот

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

У меня есть базовый класс сущности 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" имеют одинаковое простое имя "Пользователь" и поэтому не могут использоваться в той же модели. Все типы в данной модели должны иметь уникальные простые имена. Используйте "NotMappedAttribute" или вызовите Ignore в Code First fluent API, чтобы явно исключить свойство или тип из модели.

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Сначала прочтите Отображения типов таблиц

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

modelBuilder.Ignore<BaseXYZ>()

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

Ответ 3

Чтобы сохранить такое же имя класса, я предлагаю использовать разные интерфейсы. Интерфейс для Core.Entity, определяющий общие свойства и другой интерфейс для дополнительных свойств. Поэтому вместо использования производного класса вы используете класс, реализующий два интерфейса.