【发布时间】:2012-04-01 00:20:21
【问题描述】:
我正在使用 EF 5 Beta 2 Code-First。我创建了一个 edmx 文件,其中包含 2 个实体,其中包括 Brand 和 Vehicle。
一个品牌可以有零个或多个(很多)车辆,每个车辆都应该有一个品牌(必需的)。 Vehicle 有一个名为 BrandID 的外键,它是不可为空的。
(relationship)
Brand +-------------------> Vehicle
(1) (*)
我也确实使用 EF 5 DbContext Generator 来创建 POCO 类。
问题
当我尝试读取或写入记录时,我收到以下错误:
错误 3023:从第 155 行开始映射片段时出现问题:必须映射表 Vehicle 中的列 Vehicle.BrandID:它没有默认值且不可为空。
注意:我正在使用 TPC 继承映射,其中 Vehicle 是 抽象基类,其中有 2 个类(Car 和 Motorbike ) 正在派生。
这里是类定义加上相关的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,你不应该有一个抽象基类的表,只有两个具体类Car和Motorbike。另外:你有一个包含所有 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