Я уже несколько дней пытаюсь решить свою проблему с использованием первичного ключа. Пожалуйста, помогите мне решить эту загадку!!!
Я использую 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, все работало нормально. Но в нашем случае это невозможно, потому что для каждой таблицы у нас есть разные имена полей первичного ключа.
Я не знаю, как и где я ошибаюсь! Пожалуйста помогите!!!