【问题标题】:EF 4.1 Code First. Table-per-type inheritance with different primary key name from its base class' primary key nameEF 4.1 代码优先。 Table-per-type 继承,主键名与其基类的主键名不同
【发布时间】:2011-09-02 03:39:00
【问题描述】:

鉴于此:

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 中是可能的(通过设计器),只需按照实体框架 4.0 食谱,问题解决方法的第 2-11 章中的步骤进行操作。现在我首先通过 EF 4.1 在代码上尝试它

[编辑]

如果我将 ParkId 更改为 LocationId,一切正常。但是,通过设计器的方法,可以将 LocationId 映射到表 Park 的 ParkId;我想先用代码实现同样的目标

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

【问题讨论】:

    标签: entity-framework inheritance entity-framework-4.1


    【解决方案1】:

    据我所知(并且我尝试过多次)代码首先不支持这个 => 您的派生类型应该使用相同的列名作为主键。

    这个问题可以很简单地描述:当前流畅的映射实现不允许覆盖父实体的映射规则 => 父实体定义了所有派生实体中主键列的名称。

    IMO 最可能的原因是它实际上是在没有现有数据库的情况下首先设计为代码,并且您不必为数据库命名而烦恼 - 由 EF 根据需要定义名称。 DbContext API 发布后,人们开始大量使用现有数据库。但是这里出现了一个问题:最初的用例不包括在内,因此在 EDMX 中很容易完成的一些场景是不可能的。这是其中之一。

    【讨论】:

    • 很遗憾听到 DbContext 仅适用于新建项目。我希望他们能在下一个版本中纠正这个问题
    • 您知道是否有任何网站列出了这些问题以及它们得到修复的可能性吗?我很难找到任何类型的错误跟踪器,其中包含类似的东西
    【解决方案2】:

    以下是解决此问题的方法:

    为派生表创建一个视图并将您的实体类映射到该视图。重命名视图中的键列,使其与基表中的键列匹配。

    例如:

    基表用户(用户 ID、名字、姓氏)

    派生表Manager(ManagerID,DepartmentID)

    由于键列不同,实体框架无法更新管理器!

    解决方案:

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

    然后将 Manager 类映射到 UserManager 视图,而不是 Manager 表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多