この質問が古いことは知っていますが、シナリオの明示的な指示がどこにも見つかりませんでした。
データベースを作成しない構成と、データベースを作成するがエンティティを保存しない構成のモデルとの間を行ったり来たりするだけでした。
そしてもちろん、あなたが今報告しているまさにその例外は、対処するのが最も苛立たしいものの 1 つでした。
検出に問題がある可能性があります。問題がどこにあるかを判断するのに役立つように、モデルをもっと見る必要があります。
「Namespace.MyEntity」はどのように見えますか? TPT 継承マッピング戦略に参加していますか?
もしそうなら、他の TPT エンティティとの 1|1 関係 (<--実際にはありえない) または 1|* 関係がありますか?
私はここで完全に推測していますが、これを理解するには試行錯誤が必要でした。そのため、エラーを検索する人を助けるために投稿し、[-- TPT | タイプごとの表 | 必須 | 関係 | 親| 子供 | 子供 | 共有 | ベース | 概要 - ]
私のシナリオでは、 modelBuilder.Entity().HasRequired(x => x.TPT_Derived_Parent_Class).WithOptional(); という関係が必要になったとき。TPT_Derived_Child_Class を、TPT_Derived_Parent_Class とは別のプロジェクト基本クラスから継承するように強制されました。
私の解決策では、別の TPT 親クラスから派生したクラスを参照する null 非許容フィールドを持つ TPT 派生クラスがある場合、Code First によってエンティティが正しい順序で検出されることが非常に重要であることがわかりました。
派生 (第 2 レベル) 基本クラスおよび派生する具象クラスに TPT を使用している場合、他のすべてのクラス (抽象または具象) が継承する汎用プロジェクト基本クラスを持つことは (私のセットアップでは) 不可能であることがわかりました。第 2 レベルの基本クラスには、相互に外部キー関係が必要です。
たとえば、これは私にはうまくいきません:
public abstract ProjectBaseClass : IProjectBase
{
[Key]
public int ProjectClassesId {get;set;}
}
[Table("TPT_BaseClass1")]
public abstract TPT_Specialized_Base_Class1 : ProjectBaseClass
{
//...specialized stuff in here
}
[Table("TPT_BaseClass2")]
public abstract TPT_Specialized_Base_Class2: ProjectBaseClass
{
//...specialized stuff in here
}
[Table("ConcreteChild")]
public TPT_Child_Concrete_Class : TPT_Specialized_Base_Class1
{
public int TPT_Parent_Concrete_Class_KeyId {get;set;};
[ForeignKey("TPT_Parent_Concrete_Class_KeyId ")]
TPT_Parent_Concrete_Class ParentSpecializedClass {get;set;};
}
[Table("ConcreteParent")]
public TPT_Parent_Concrete_Class : TPT_Specialized_Base_Class2
{
//optional relationship
public int? TPT_Child_Concrete_Class_KeyId {get;set;};
[ForeignKey("TPT_Child_Concrete_Class_KeyId")]
TPT_Child_Concrete_Class ChildSpecializedClass {get;set;};
}
public projectContext: DbContext
{
public DbSet<TPT_Specialized_Base_Class1>
public DbSet<TPT_Specialized_Base_Class2>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// There is no configuration I could find that would make the model above work!
// However, if you make each TPT_Specialized_Base_Class inherit from different
// ProjectBaseClass like:
public ProjectBaseClass1 : IProjectBase
public ProjectBaseClass2 : IProjectBase
public TPT_Specialized_Base_Class1 : ProjectBaseClass1 {...}
// and
public TPT_Specialized_Base_Class2 : ProjectBaseClass2 {...}
// or, more sensible...
public TPT_Specialized_Base_Class1 : IProjectBase
// and
public TPT_Specialized_Base_Class2 : IProjectBase
// then you can do the following, making sure you *discover* the child TPT base
// class first
modelBuilder.Entity<TPT_Specialized_Base_Class1>() //this one is inherited by the derived class that has the *required* reference to a TPT derived parent
.Ignore(x => x.PropertyNamedInErrorMessage);
modelBuilder.Entity<TPT_Specialized_Base_Class2>();
.Ignore(x => x.PropertyNamedInErrorMessage);
// when I flipped the order of the classes above, it could not determine the
// principal end of the relationship, had a invalid multiplicity, or just wouldn't
// save...can't really remember what it was crying about...
modelBuilder.Entity<TPT_Child_Concrete_Class>()
.HasRequired(x => x.TPT_Parent_Concrete_Class ).WithOptional();
& ProjectBaseClass2
}
}