私は、サプライヤー、顧客、またはその両方Organisation
になることができるビジネスを表すエンティティを持っています。
エンティティは次のようになります。
public abstract class Organisation
{
public Organisation()
{
IsCustomer = false;
IsSupplier = false;
}
public int Id { get; set; }
public string Name { get; set; }
public bool IsSupplier { get; set; }
public bool IsCustomer { get; set; }
}
Customer
私はand と呼ばれる組織のサブクラスを作成しました。これにより、ドメインの他の部分でSupplier
作業する際に作業が容易になります (例:であるのみが注文書に関連付けられます)。Organisations
Organisation
Supplier
クラスから派生する 2 つのクラスを作成しましたOrganisation
。
public class Supplier : Organisation
{
}
public class Customer : Organisation
{
}
次に、これらのクラスをテーブルにマップする方法を Entity Framework に伝えたいと思います。すべての情報は「組織」と呼ばれる単一のテーブルに保存されるため、TPH (階層ごとのテーブル) マッピングを使用しようとしています。
マッピングを機能させる方法は次のとおりです。
- を照会する場合、およびプロパティ
Organisations
の値に関係なく、Entity Framework がすべての組織を返すようにします。IsCustomer
IsSupplier
- をクエリ
Suppliers
した場合、Entity Framework が を含むすべての組織を返すようにしIsSupplier = true
ます。 - をクエリ
Customers
した場合、Entity Framework が を含むすべての組織を返すようにしIsCustomer = true
ます。
組織が顧客とサプライヤーの両方になることは有効であるため、一部の組織はクエリCustomer
とSupplier
クエリの両方に含まれると予想されます。
定義した構成クラスは次のとおりです。
class OrganisationConfiguration : EntityTypeConfiguration<Organisation>
{
internal OrganisationConfiguration()
{
ToTable("Organisations");
HasKey(o => o.Id);
Map<Customer>(m =>
{
m.Requires("IsCustomer").HasValue(true);
});
Map<Supplier>(m =>
{
m.Requires("IsSupplier").HasValue(true);
});
}
}
これによりDataException
、次のメッセージがスローされます。
エラー 3032: 行 59 から始まるフラグメントのマッピングの問題: 'IsNull=False' 以外の条件を持つ条件メンバー 'Organisation.IsSupplier' がマップされています。Organization.IsSupplier の条件を削除するか、マッピングから削除してください。
このエラーを修正する方法がわかりません。または、私が見たすべての例には単一の識別子列があるため、やりたいことが可能かどうかさえわかりません。顧客とサプライヤーの両方である組織を区別する必要があるため、単一の識別子で希望する結果を達成できるかどうかはわかりません。
アップデート:
いくつかの調査の後、エラーは、クラスで定義されたIsSupplier
およびIsCustomer
プロパティを持っていることが原因のようです。Organisation
これらのプロパティを削除すると、データベースが適切に構築され、マッピングが機能します (Entity Framework はテーブルに個別の識別子を作成します)。
これを 3 つの個別のクエリ (1 to select Organisations
、1 to select Customers
、1 to select Suppliers
) でテストしましたが、正しい結果が得られたようで、ソリューションの約 90% に到達しました。
私が今抱えている問題はCustomer
、データベースから を選択する方法が必要であり、サプライヤーとしても設定する方法が必要なことです (設定するプロパティがないため)。