EF Code-First наследование и проблема первичного ключа - PullRequest
0 голосов
/ 15 августа 2011

Я пытаюсь создать функцию, которая автоматически добавляет таблицу контрольного журнала, когда она мне нужна.Это вроде работает, но единственная проблема в том, что таблица аудита не получает указанный первичный ключ, он сохраняет ранее указанный ItemId в качестве первичного ключа.

Это потому, что я наследую Department в ADepartmentи уже указал первичный ключ в первом EntityTypeConfiguration.Я предполагаю, что EF достаточно умен, чтобы понять это, но это не то, что я хочу.

Есть ли способ, которым я могу сказать второй EntityTypeConfiguration, что он должен прекратить использовать ItemId в качестве первичного ключа и начать использовать AuditId для этого?

    public class Item
    {
        public int ItemId { get; set;}
    }

    public class Department : Item
    {
        public string Name { get; set; }           
    }

    public class ADepartment : Department, IAudit
    {        
        public int AuditId { get; set; }        
    }


    EntityTypeConfiguration<Department> cfg = new EntityTypeConfiguration<Department>();
    cfg.HasKey(p => p.ItemId);
    cfg.Map(p => p.MapInheritedProperties());                            
    cfg.ToTable(string.Format("Entity{0}", typeof(Department).Name));
    model.Configurations.Add<Department>(cfg);

    EntityTypeConfiguration<ADepartment> c = new EntityTypeConfiguration<ADepartment>();
    c.HasKey(p => p.AuditId);          
    c.Map(p => p.MapInheritedProperties());
    c.ToTable(string.Format("Audit{0}", typeof(ADepartment).Name));            
    model.Configurations.Add<ADepartment>(c);

1 Ответ

1 голос
/ 16 августа 2011

Нет, нет способа сделать это. Объекты в иерархии наследования должны иметь общие свойства. Если вам нужен другой ключ для вашей записи аудита, вам нужен другой тип объекта, который не унаследован от исходного типа. Использование унаследованного типа для аудита вызовет у вас много проблем, поэтому вы все равно должны это сделать. Например:

  • Каждый ваш запрос должен будет использовать OfType<Department>, иначе вы также загрузите записи аудита.
  • Ленивая и энергичная загрузка отношений в Department загрузит и Department, и ADepartment - избежать этого невозможно, кроме использования явной загрузки с OfType<Department>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...