4

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

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

Для определения сущности мы используем несколько слоев вложенности. В самом низу мы имеем 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; } 
    } 

Внимание! У нас есть одно ключевое различие - имя первичного ключа таблицы таблиц НЕ «ИД»! Мы используем шаблон PK_. По этой причине мы не включаем определение поля PK в BaseEntity. Кроме того, мы используем использование 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, все работает нормально. Но это невозможно в нашем случае, потому что для каждой таблицы мы имеем имя имени основного ключа ключа netnet.

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

+0

Хм ... Я не помню, чтобы эту проблему с CTP3. К сожалению, я еще не успел поиграть с CTP4. – djskinner

+0

Может быть, есть какая-то особенность в том, как Huyrua реализовал репозитарные patern-объекты, содержащиеся в сборке, идентифицируются и автоматически добавляются в контекст. –

ответ

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");