Я уже несколько дней борюсь за решение проблемы с использованием первичного ключа. Пожалуйста, помогите мне решить эту загадку !!!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.
Я не знаю пути и где я ошибаюсь! Пожалуйста, помогите мне!!!
Хм ... Я не помню, чтобы эту проблему с CTP3. К сожалению, я еще не успел поиграть с CTP4. – djskinner
Может быть, есть какая-то особенность в том, как Huyrua реализовал репозитарные patern-объекты, содержащиеся в сборке, идентифицируются и автоматически добавляются в контекст. –