与一对多关系中的FK相关的错误

时间:2012-04-01 00:20:21

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

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

一个品牌可以拥有零个或多个(多个) Vehicle ,而每个 Vehicle 都应该有一个品牌(需要)。 Vehicle 有一个名为 BrandID 的外键,不可为空

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

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

问题

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

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

注意:我正在使用 TPC 继承映射,其中Vehicle是抽象基类,其中有2个类( Car & 摩托车)正在衍生出来。

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

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

任何想法都会非常感激。

1 个答案:

答案 0 :(得分:1)

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

  

...在EF中使用TPC会强制您避免基础中的关联   键入...

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

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