Использование нестандартного имени первичного ключа Entity Framework CTP4 в BaseEntity

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

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

Для определения Entity мы используем несколько вложенных слоев. В самом низу у нас есть BaseEntity, который содержит некоторые общие поля, например:

public abstract class BaseEntity: IEntityBase
    {
        public virtual Nullable<System.DateTime> InsertDate { get; set; }
        public virtual Nullable<int> PK_InsertUserAccount { get; set; }
        public virtual byte[] TimeStamp { get; set; }
    }

Затем мы получаем от этого класса наши конкретные объекты, например:

public class Person : BaseEntity
    {
        public virtual int PK_Person { get; set; }
        public virtual byte PersType { get; set; }
        public virtual string eMail { get; set; }
        public virtual string Name { get; set; }
    }

Примечание! У нас есть одно ключевое отличие - имя первичного ключа таблицы БД НЕ "Id"! Мы используем шаблон PK_. По этой причине мы не включаем определение поля PK в BaseEntity. Кроме того, мы используем use EntityConfiguration для сопоставления нашего неконвенционного первичного ключа:

public class PersonMapping : EntityConfiguration<Person>
    {
        public PersonMapping()
        {
            this.HasKey(p => p.PK_Person);
            this.Property(p => p.PK_Person).IsIdentity();
            this.MapSingleType().ToTable("dbo.Person"); //otherwise by convention it is  converted to "People"
        }
    }

А вот у нас проблемы. Когда я пытаюсь использовать сущность Person, я получаю сообщение об ошибке "Невозможно определить ключ для типа сущности "KDC.Model.Entities.BaseEntity". Кажется, что ObjectContext должен иметь определенный первичный ключ в самом базовом классе. Потому что, когда в экспериментальных целях я перемещал определение поля PK в BaseEntity, все работало нормально. Но в нашем случае это невозможно, потому что для каждой таблицы у нас есть разные имена полей первичного ключа.

Я не знаю, как и где я ошибаюсь! Пожалуйста помогите!!!


person Edgars Palacis    schedule 03.08.2010    source источник
comment
Хм... Я не припоминаю, чтобы у меня была такая проблема с CTP3. К сожалению, у меня еще не было возможности поиграться с CTP4.   -  person djskinner    schedule 04.08.2010
comment
Возможно, есть какая-то особенность в том, как Huyrua реализовал шаблон Repository - объекты, содержащиеся в сборке, идентифицируются и автоматически добавляются в контекст.   -  person Edgars Palacis    schedule 04.08.2010


Ответы (1)


Вместо использования MapSingleType попробуйте использовать MapHierarchy и укажите поля.

Например

modelBuilder.Entity<Person>().MapHierarchy(p => new { p.PK_Person, p.PersType, p.Name, p.eMail, p.InsertDate, p.PK_InsertUserAccount, p.TimeStamp}).ToTable("Persons");
person ckal    schedule 10.10.2010