我正在使用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);
这很奇怪,因为一切似乎都好,并且已经多次检查过。
任何想法都会非常感激。
答案 0 :(得分:1)
TPC继承不适用于您在基类型上有导航属性的此类模型:
...在EF中使用TPC会强制您避免基础中的关联 键入...
(引自这里:http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx)
您必须为您的模型使用TPT或TPH继承。