2015-03-25 2 views
3

У меня есть схема устаревшей базы данных, которую я хотел бы моделировать с помощью сопоставления структуры Entity Framework для каждого типа. Однако в таблице базовых таблиц и подкласса используются разные имена для первичного ключа, и EF, похоже, не нравится.Модель данных типа Table-Per-Type с разными именами клавиш?

Например:

[Table("People")] 
abstract class Person { 
    [Key, Column("Id")] 
    public int Id { get; set; } 

    // Person properties... 
} 

[Table("Employees")] 
class Employee : Person { 
    [Key, Column("PersonId")] 
    public new int Id { get; set; } 

    // Employee-specific properties... 
} 

Это на самом деле работает, по крайней мере, для чтения: Employee отображается на запись из таблицы People плюс записи из Employees таблицы. Однако Entity Framework не заполняет Employee.Id (он всегда равен нулю), поэтому я прибегал к аннотации Employee.Id как [Obsolete], чтобы убедиться, что остальная часть моего кода не пытается его использовать.

Я боюсь, что использование new таким образом кажется ужасным взломом.

Есть ли более идиоматический/правильный способ сделать это?

+0

На самом деле самое страшное в том, что код Linq-to-entities _has_ использует (новое) свойство 'Id', но не-код базы данных _cannot_ использует свойство' Id'. Тьфу. – andrewf

+0

У меня есть решение (см. Ниже), но, возможно, это просто обход. Другие идеи приветствуются. – andrewf

ответ

2

Хорошо ... У меня есть немного решения для этого ... Проблема в том, что единственный способ объявить разные имена ключей для первичного ключа в базовой таблице, а производная таблица - снова объявить ключ в производном классе и что EF не устанавливая значение ключа на производном классе, так:

[Table("Employees")] 
class Employee : Person { 
    [Key, Column("PersonId")] 
    public new int Id {get{return base.Id;}set{base.Id=value;}} 
} 

Объявить ключ в производном классе, но у него делегат ключевое свойство в базовом классе. Когда Entity Framework устанавливает одно, он автоматически устанавливает оба параметра - и это нормально, потому что по определению они должны быть одинаковыми.

Смежные вопросы