私は、Entity Framework Code Firstを使用して、既存のC#コードをデータベースにマップするプロジェクトに携わっています。ここではコード自体を再現するつもりはありませんが、同じ問題をカバーするはずの擬似コードをいくつか紹介します。
クラスを他のクラスのリストがあるデータベースにマップしようとしています。例を示します。
public Class ListClass
{
public List<SubClassA> ListOne
{
get { return BaseClass.OfType<SubClassA>().Where(b => !b.BoolOne && b.BoolTwo).ToList(); }
}
public List<SubClassA> ListTwo
{
get { return BaseClass.OfType<SubClassA>().Where(b => b.BoolOne && b.BoolTwo).ToList(); }
}
}
public abstract class BaseClass
{
public bool BoolOne {get; set;}
#Region EF
public GUID PrimaryKey {get; set;}
public GUID ListClassForeignKey {get; set;}
#EndRegion
}
public class SubClassA : BaseClass
{
public bool BoolTwo {get; set}
}
Class SubClassB : BaseClass
{
//Contents..
}
概要:ListClassには、SubClassAのリストが含まれています。BaseClassとSubClassAは、ListClassについて何も知りません。BaseClassのGUID属性は、Entity Frameworkで使用するために追加されます。それ以外の場合、既存のクラスは変更されていません。そのため、このプロジェクトではFluentAPIを使用しています。
class ListClassConfiguration : EntityTypeConfiguration<ListClass>
{
public ListClassConfiguration()
{
HasKey(f => f.PrimaryKey);
Property(f => f.PrimaryKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasMany(f => f.ListOne).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
HasMany(f => f.ListTwo).WithOptional().HasForeignKey(f => f.ListClassForeignKey);
}
}
Contextクラスでは、この構成を追加するだけです。モデルが変更されるたびに、データベースは削除されます。現在、BaseClassとそのサブクラスにTPHマッピングを使用しています。
リスト内の参照されたオブジェクトを使用してListClassを追加および保存しようとすると、次の例外が発生します。
InvalidOperationException。外部キーコンポーネント'ListClassForeignKey'は、タイプ'SubClassA'で宣言されたプロパティではありません。モデルから明示的に除外されていないこと、および有効なプリミティブプロパティであることを確認してください。
それで、何かアドバイスはありますか?
編集:実際のプロジェクトでは、空のリストがあるように見えることに気づきました。構成クラスの外部キーを削除しようとしましたが、内容のないデータベーステーブルを取得しました(列にNULL値のみが含まれる1行)。この例では、「BaseClass」という名前のTPHテーブルのみが空であるか、NULL値のみを持っていることを意味します。それは問題のいくつかを説明できますか?