0

既存の 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' のストレージ プロパティに既にマップされています。概念的なサイド プロパティがストレージ モデル内の複数のプロパティにマップされている場合は、ストレージ モデル内のすべてのプロパティが同じ型であることを確認してください。

上で述べたように、私はデータベースとそのタイプを制御できません。キーの種類が混在しているなんて馬鹿げていますが、「それはそれで」です。

どうすればこれを回避できますか?

4

1 に答える 1

2

マッピングでは達成できません。これは、まず EF コードの制限です。継承構造内の各プロパティ (キーを含む) を 1 回だけマップできます。そのため、継承ツリーのすべてのエンティティで整数または小数を使用できますが、混在させることはできません。

ところで。intまたはdecimal継承ツリー全体を使用しようとするとどうなりますか? エンティティの読み込みまたは永続化に失敗しますか? そうでない場合は、すべてのエンティティに対して(おそらくdecimalその範囲全体を使用できる場合)単純に使用できます。

于 2012-06-25T22:30:14.960 に答える