1

エンティティクラスの継承関係のためにデータベースがどのように生成されるかに問題があります。サブクラステーブルの主キーIDがスーパークラステーブルのIDを参照するように正しく作成していますが、スーパークラステーブルに不要な外部キーも作成しています。これが私のクラスです:

抽象スーパークラス:

public abstract class DaqObject
{
    public int ID { get; set; }
    public int AgencyID { get; set; }
    public int DaqObjectTypeID { get; set; }

    [ForeignKey("AgencyID")]
    public virtual Agency Agency { get; set; }
    [ForeignKey("DaqObjectTypeID")]
    public virtual DaqObjectType DaqObjectType { get; set; }

    public virtual Document InheritingDocument { get; set; }
}

対応するデータベーステーブルには、次の列があります。

  • ID(PK、int、nullではない)
  • AgencyID(FK、int、nullではない)
  • DaqObjectTypeID(FK、int、nullではない)
  • InheritingWell_ID(FK、int、null)

サブクラス:

public class Document : DaqObject
{
    public string Name { get; set; }
}

次の列を持つ対応するデータベーステーブルを使用します。

  • ID(PK、FK、int、nullではない)
  • 名前(nvarchar(max)、null)

(例として、これらのクラスはスリム化されています。)

データベース内のDaqObjectテーブルは、最終的にInheritingDocument_ID列になります。自分でデータベースを作成し、スーパークラステーブルにその外部キーがなくても関係を作成できます。EFコードに最初に同じことをさせることは可能ですか?

4

2 に答える 2

2

はEFに、エンティティ間の1つ:多くの関係を作成するようInheritingDocumentに指示します。そのため、DBに列があります。DaqObjectDocumentDaqObjectInheritingDocument_ID

おそらく、それはあなたが望むものではないでしょう、あなたはInheritingDocument継承を機能させるためにプロパティを追加しましたね?必要はありません。EFが継承処理を自動的に処理します。EFで継承されたクラスを操作するための可能な戦略を説明する素晴らしいブログ投稿があります。

于 2012-12-16T23:09:09.883 に答える
0

InheritingDocumentIDは、プロパティ用に生成されたフィールドです

public virtual Document InheritingDocument { get; set; }

その関係は、デフォルトでEFによって作成されます。

不明ですが、InheritingWell_ID (FK, int, null)フィールドとは何か、投稿したコードに何かが欠けていると思います。

InheritingDocumentプロパティに属性を追加[NotMapped]して、フィールドの生成を回避できますが、これを機能させるには、DbSetをdbコンテキストに追加する必要もあります。これにより、階層ごとのテーブル(階層内のすべてのタイプに対して1つのテーブル)が高速になります。しかし、それは3NFにはありません。

于 2012-12-17T06:29:03.127 に答える