2

我正在使用 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)。

这是类定义加上相关的流畅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);

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

任何想法将不胜感激。

4

1 回答 1

1

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

...在 EF 中使用 TPC 会强制您避免基本类型中的关联...

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

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

于 2012-04-01T19:02:23.560 回答