そのため、FluentでCode Firstを使用して、テーブルスキーマがTable-per-Type配置である1つの派生型で基本クラスをマップしようとしています。また、派生型は、複合外部キーを持つ別の型と多対1の関係にあります。(これらのテーブルのキーは変更できず、名前は完全に一致します。)
これが私がCSharpで達成しようとしていることの例です:
public class BaseType
{
public int Id;
public int TenantId;
public int Name;
}
public class DerivedType : BaseType
{
public int Active;
public int OtherTypeId;
public OtherType NavigationProperty;
}
構成クラスでのこの構成は次のとおりです。
public BaseTypeConfiguration()
{
ToTable("BaseTypes", "dbo");
HasKey(f => new { f.Id, f.TenantId});
Property(f => f.Id)
.HasColumnName("BaseTypeId")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
public DerivedTypeConfiguration()
{
ToTable("DerivedTypes", "dbo");
//OtherType has many DerivedTypes
HasRequired(dt=> dt.OtherTypeNavigation)
.WithMany(ot=> ot.DerivedTypes)
.HasForeignKey(dt=> new { dt.OtherTypeId, dt.TenantId});
}
マッピングが正しく設定されていることがわかります(このように、この正確な状況であるが単一の列識別子を持つ多くのチュートリアルと例に従いました)
これらのエンティティをクエリしようとすると、例外が発生します。
The foreign key component 'TenantId' is not a declared property on type 'DerivedType'.
new
また、キーワードを使用して型でこれらのプロパティを明示的に宣言しようとすると、重複するプロパティが存在するという例外が発生します。
EFチームからの回答
これは、EFが基本型で定義されたプロパティを持ち、それを派生型の外部キーとして使用することをサポートしていない、より基本的な制限の一部です。残念ながら、これはコードベースから削除するのが非常に難しい制限です。リクエストはあまり多くないので、現段階では対応していないので、この号を締めくくります。