C# 如何将键属性映射到EF CodeFirst中继承实体上的不同列类型?
我试图在EF 4.3 CodeFirst中为现有Oracle数据库(我无法控制)实现TPC继承模型。我有几个子类型,每个子类型映射到自己的表。不幸的是,一些关键列的数据类型是C# 如何将键属性映射到EF CodeFirst中继承实体上的不同列类型?,c#,oracle,ef-code-first,entity-framework-4.3,table-per-type,C#,Oracle,Ef Code First,Entity Framework 4.3,Table Per Type,我试图在EF 4.3 CodeFirst中为现有Oracle数据库(我无法控制)实现TPC继承模型。我有几个子类型,每个子类型映射到自己的表。不幸的是,一些关键列的数据类型是number(18,0),而不是integer。EF现在似乎恨我 这是我的基本类: public abstract class Vehicle { public virtual int Id { get; set;} public virtual string Color { get; set; }
number(18,0)
,而不是integer
。EF现在似乎恨我
这是我的基本类:
public abstract class Vehicle
{
public virtual int Id { get; set;}
public virtual string Color { get; set; }
//more properties
}
以下是一些示例子类型:
public class Car : Vehicle
{
//more properties
}
public class Truck : Vehicle
{
//more properties
}
public class Motorcycle : Vehicle
{
//more properties
}
这是我的数据库:
public class VehicleDataContext : DbContext
{
public DbSet<Vehicle> Vehicles { get; set; }
public DbSet<Car> Cars { get; set; }
public DbSet<Truck> Trucks { get; set; }
public DbSet<Motorcycle> Motorcycles { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Vehicle>().HasKey(x => x.Id);
modelBuilder.Entity<Car>().Map(m => m.MapInheritedProperties());
modelBuilder.Entity<Car>().Property(x => x.Id).HasColumnType("decimal");
modelBuilder.Entity<Truck>().Map(m => m.MapInheritedProperties());
modelBuilder.Entity<Truck>().Property(x => x.Id).HasColumnType("int");
modelBuilder.Entity<Motorcycle>().Map(m => m.MapInheritedProperties());
modelBuilder.Entity<Motorcycle>().Property(x => x.Id).HasColumnType("decimal");
base.OnModelCreating(modelBuilder);
}
}
引发的异常是:
概念端属性“Id”已映射到存储
类型为“decimal”的属性。如果概念侧属性为
映射到存储模型中的多个属性,请确保
存储模型中的属性具有相同的类型
如上所述,我无法控制数据库及其类型。键类型混合是愚蠢的,但“它就是它”
我该如何解决这个问题?您无法通过映射实现它。这首先是EF代码的限制。在继承结构中,每个属性(包括键)只能映射一次。因此,您可以在继承树中的所有实体中使用整数或小数,但不能混合使用
顺便说一句,如果您尝试对整个继承树使用
int
或decimal
,会发生什么?加载或持久化实体是否失败?如果不是,你可以简单地对所有实体使用一个(可能是十进制的
,如果它可以使用整个范围的话)。你的工作解决了这个问题。我对所有类型使用了decimal
,我的主键停止抱怨了。谢谢
[TestFixture]
public class when_retrieving_all_vehicles
{
[Test]
public void it_should_return_a_list_of_vehicles_regardless_of_type()
{
var dc = new VehicleDataContext();
var vehicles = dc.Vehicles.ToList(); //throws exception here
Assert.Greater(vehicles.Count, 0);
}
}