【问题标题】:Error Related to FK in One-to-Many Relationship与一对多关系中的 FK 相关的错误
【发布时间】:2012-04-01 00:20:21
【问题描述】:

我正在使用 EF 5 Beta 2 Code-First。我创建了一个 edmx 文件,其中包含 2 个实体,其中包括 BrandVehicle

一个品牌可以有零个或多个(很多)车辆,每个车辆都应该有一个品牌(必需的)。 Vehicle 有一个名为 BrandID 的外键,它是不可为空的

(relationship)   
    Brand  +------------------->  Vehicle
          (1)                  (*)

我也确实使用 EF 5 DbContext Generator 来创建 POCO 类。

问题

当我尝试读取或写入记录时,我收到以下错误:

错误 3023:从第 155 行开始映射片段时出现问题:必须映射表 Vehicle 中的列 Vehicle.BrandID:它没有默认值且不可为空。

注意:我正在使用 TPC 继承映射,其中 Vehicle 是 抽象基类,其中有 2 个类(CarMotorbike ) 正在派生。

这里是类定义加上相关的fluent API代码:

//------------ Class definiions ---------------

public abstract partial class Vehicle
{
    public int VehicleID { get; set; }
    public short BrandID { get; set; }

    public virtual Brand Brand { get; set;
}

public partial class Car : Vehicle
{
    public string BodyType { get; set; }
}

public partial class Motorbike : Vehicle
{
}

public partial class Brand
{
    public Brand()
    {
        this.Vehicles = new HashSet<Vehicle>();
    }        

    public short BrandID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Vehicle> Vehicles { get; set; }
}


//--------------- Fluent API code ---------------

modelBuilder.Entity<Vehicle>()
    .Property(p => p.VehicleID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);    

modelBuilder.Entity<Car>()
    .Map(m =>
    {
        m.ToTable("Car");
        m.MapInheritedProperties();
    });

modelBuilder.Entity<Motorbike>()
    .Map(m =>
    {
        m.ToTable("Motorbike");
        m.MapInheritedProperties();
    });

modelBuilder.Entity<Brand>()
    .HasMany(b=>b.Vehicles)
    .WithRequired(v=>v.Brand)
    .HasForeignKey(p => p.BrandID);


modelBuilder.Entity<Brand>()
    .Property(p => p.BrandID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

这太奇怪了,因为一切似乎都正常并且已经检查了好几次。

任何想法将不胜感激。

【问题讨论】:

  • 你真的有一个Vehicle 例外说的表吗?我想知道,因为如果你使用 TPC,你不应该有一个抽象基类的表,只有两个具体类 CarMotorbike。另外:你有一个包含所有 edm 元数据的连接字符串吗?我希望这是因为显然您使用的是模型优先。但我想知道为什么你有 Fluent API 映射代码,它是 Code-First 而不是 Model-First。
  • @Slauma: 1. 另一个奇怪的事情——正如你提到的——是我有一个Vehicle 类,而对于另一个名为Ad 的抽象基类及其派生类则不会发生这种情况。 2.我的连接字符串如下: 3. 关于 Model-First:首先我使用 EDM Designer 对我的实体进行可视化建模。然后我使用 EF DbContext Generator 创建 POCO 类和DbContext。最后我使用 EF + Fluent API 来创建数据库。
  • 如果您在 Fluent API 中显示上述类的完整映射,尤其是 TPC 映射,也许会有所帮助。在 基类 (Vehicle) 上具有导航属性 (Brand) 可能是 TPC 的问题:weblogs.asp.net/manavi/archive/2011/01/03/…(请参阅本文中的“多态关联与 TPC 存在问题”一节) .
  • 我在上面的主要问题中添加了 Fluent API 代码。请你看一下好吗?

标签: entity-framework one-to-many foreign-key-relationship abstract-base-class


【解决方案1】:

TPC 继承不适用于这种在基本类型上有导航属性的模型:

...在 EF 中使用 TPC 会迫使您避免在您的基地中进行关联 输入...

(此处引用:http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx

您的模型必须使用 TPT 或 TPH 继承。

【讨论】:

  • 感谢好友的大力帮助。救了我的命!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多