Код EF 4.1 Первый. Наследование таблиц по типам с именем первичного ключа, отличным от имени первичного ключа базового класса - PullRequest
4 голосов
/ 02 сентября 2011

Учитывая это:

create table Location(
LocationId int identity(1,1) not null primary key,
Address nvarchar(max) not null,
City nvarchar(max) null,
State nvarchar(max) not null,
ZipCode nvarchar(max) not null
);



create table Park(
ParkId int not null primary key references Location(LocationId),
Name nvarchar(max) not null
);

Я пробовал это сопоставление:

modelBuilder.Entity<Location>();
modelBuilder.Entity<Park>().ToTable("Park");
modelBuilder.Entity<Park>().Property(x => x.LocationId).HasColumnName("ParkId");

К сожалению, это не сработало.

using (var db = new Ef())
{
    var park = new Park { Name = "11th Street Park", Address = "801 11th Street", City = "Aledo", State = "TX", ZipCode = "76106" };
    db.Set<Location>().Add(park);

    db.SaveChanges();
}

Имеет эту ошибку:

Свойство LocationId не является объявленным свойством типа Park.Убедитесь, что свойство не было явно исключено из модели с помощью метода Ignore или аннотации данных NotMappedAttribute.Убедитесь, что это действительное примитивное свойство.

Как мне сопоставить объект Park, чтобы его свойство LocationId попадало в столбец ParkId?

У меня есть это отображение, кстати:

public class Location
{
    public virtual int LocationId { get; set; }
    public virtual string Address { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual string ZipCode { get; set; }
}

public class Park : Location
{
    public virtual string Name { get; set; }
}

Если это могло бы помочь, это возможно в EF 4.0 (через дизайнера), просто следуя шагам в Главе 2-11 Рецептов Entity Framework 4.0, Подход к решению проблемы.Теперь я пробую код сначала через EF 4.1

[EDIT]

Если я изменю ParkId на LocationId, все в порядке.Однако, используя дизайнерский подход, можно отобразить LocationId на ParkId таблицы Park;Сначала я хочу добиться того же самого с помощью кода

create table Park( 
LocationId int not null primary key references Location(LocationId), 
Name nvarchar(max) not null 
); 

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Как я знаю (и я пробовал это несколько раз), сначала код не поддерживает это => ваш производный тип должен использовать те же имена столбцов для первичного ключа.

Эту проблему можно описать очень просто: Текущийсвободная реализация отображения не позволяет переопределять правила отображения из родительской сущности => родительская сущность определяет имена столбцов первичного ключа во всех производных сущностях.

IMO наиболее вероятная причина в том, что она действительно была спроектирована как код, где выне существует существующей базы данных, и вам не нужно беспокоиться об именовании базы данных - это было до EF, чтобы определить имена по мере необходимости.Когда был выпущен DbContext API, люди начали широко использовать его с существующей базой данных.Но тут возникает проблема: первоначальные варианты использования не учитывались, поэтому некоторые сценарии, которые довольно легко реализовать в EDMX, невозможны.Это один из них.

0 голосов
/ 21 июня 2013

Вот обходной путь для этой проблемы:

Создайте представление для производной таблицы и сопоставьте свой класс сущности этому представлению.Переименуйте ключевой столбец в своем представлении, чтобы он соответствовал ключевому столбцу в базовой таблице.

например:

базовая таблица User (UserID, FirstName, LastName) * производная 1007 *

Table Manager (ManagerID, DepartmentID)

Entity Framework не удается обновить Manager, так как ключевой столбец отличается!

решение:

create view UserManager
as
select
ManagerID as UserID,
DepartmentID
from Manager

Затем сопоставьте класс Manager сПредставление UserManager вместо таблицы Manager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...