8

私は、次のような非常に単純なデータベーステーブルのセットを持っています。

Vehicle
 Id
 RegNo

Car
 Id (FK of Vehicle.Id)
 OtherStuff

Bike
 Id (FK of Vehicle.Id)
 MoreStuff

私のクラスモデルはあなたが期待する通りです:Vehicleは抽象クラスであり、次にCarとBikeはそのサブクラスです。

EF4.1コードファースト構成を次のようにセットアップしました。

class VehicleConfiguration : EntityTypeConfiguration<Vehicle> {
    public VehicleConfiguration() {
        ToTable("Vehicles");
        Property(x => x.Id);
        Property(x => x.RegNo);
        HasKey(x => x.Id);
    }
}

class CarConfiguration : EntityTypeConfiguration<Car> {
    public CarConfiguration() {
        ToTable("Cars");
        Property(x => x.OtherStuff);
    }
}

class BikeConfiguration : EntityTypeConfiguration<Bike> {
    public BikeConfiguration() {
        ToTable("Bikes");
        Property(x => x.MoreStuff);
    }
}

ただし、EFがモデル構成を構築しようとすると、多くの奇妙な例外が発生します。

現在、これを破棄しています:

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.

その列名はどこから取得していますか?それは私のコードやデータベース自体にはありません。制御を引き継ぐのは何らかの慣習に違いありません。タイプごとのテーブルを使用するようにEFに指示するにはどうすればよいですか?

Vehicleクラスから「abstract」キーワードを削除すると(これは、ラインのどこかで健全性テストとして実行しました)、次のような別の例外が発生します。

(35,10) : error 3032: Problem in mapping fragments starting at lines 30, 35:EntityTypes AcmeCorp.Car, AcmeCorp.Bike are being mapped to the same rows in table Vehicles. Mapping conditions can be used to distinguish the rows that these types are mapped to.

私は明らかにひどく間違ったことをしているのですが、何ですか?私はMSDNのドキュメントと私が見つけることができる他のすべてのTPT+EF4.1の記事に従いました!

4

2 に答える 2

8

次の記事を読んだことがありますか?

以下のアプローチをカバーする3部構成の記事です

  1. 階層ごとのテーブル(TPH): SQLスキーマを非正規化することでポリモーフィズムを有効にし、型情報を保持する型判別列を利用します。

  2. タイプごとのテーブル(TPT): 「isa 」(継承)関係を「hasa」(外部キー)関係として表します。

  3. 具象クラスごとのテーブル(TPC): SQLスキーマからポリモーフィズムと継承の関係を完全に破棄します。

于 2011-07-29T22:24:07.120 に答える