既存の Oracle データベース (制御できない) に対して、EF 4.3 CodeFirst で TPC 継承モデルを実装しようとしています。それぞれが独自のテーブルにマップされるいくつかのサブタイプがあります。残念ながら、一部のキー列は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
}
そして、ここに私のDbContetがあります:
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);
}
}
MapInheritedProperties
したがって、ベースとサブタイプのすべてのプロパティが 1 つのテーブルにマップされることは既にわかっています。キーがマップされていHasKey
ないことをEFが文句を言わないように、ベースにそれを伝える必要があると想定しています。DbSet<Vehicle>
上記で行ったように、各エンティティに独自のキーの列タイプをマップする方法を「伝える」ことができると想定できるようにしたいと思います。しかし、それだけではないと思います。
失敗するテストは次のとおりです。
[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);
}
}
スローされる例外は次のとおりです。
概念的なサイド プロパティ 'Id' は、タイプ 'decimal' のストレージ プロパティに既にマップされています。概念的なサイド プロパティがストレージ モデル内の複数のプロパティにマップされている場合は、ストレージ モデル内のすべてのプロパティが同じ型であることを確認してください。
上で述べたように、私はデータベースとそのタイプを制御できません。キーの種類が混在しているなんて馬鹿げていますが、「それはそれで」です。
どうすればこれを回避できますか?