web-dev-qa-db-ja.com

Entity Framework Code First-関係/キーの定義

最初にコードを使用してデータベースを設計していますが、少し助けが必要だと思います。

このエラーが発生しています:

テーブル 'Invoices'にFOREIGN KEY制約 'SalesOrder_Invoices'を導入すると、サイクルまたは複数のカスケードパスが発生する場合があります。 ON DELETE NO ACTIONまたはON UPDATE NO ACTIONを指定するか、他の外部キー制約を変更します。
制約を作成できませんでした。以前のエラーを参照してください。

私は次の関係/キーを持つようにしています:

--> = 1 to Many Relationship
  1. 顧客-> CustomerLocation
  2. CustomerLocation-> SalesOrder
  3. SalesOrder->請求書
  4. SalesRep-> SalesOrder
  5. PaymentTerm->顧客
  6. PaymentTerm-> SalesOrder
  7. PaymentTerm->請求書

私は次の基準でそれらを定義しようとしています:

<ClassName><PrimaryKeyID>

例:CustomerにはIDプロパティがあるため、CustomerLocationで次のように外部キーを定義します。

Public Property CustomerID AS Integer

私がしなければならないのは、外部キーを正しく定義することですか?定義するキーごとにナビゲーションプロパティも必要ですか?

また、オブジェクトの同じ主キーに複数の外部キーを設定することはできませんか?

更新済み

関係を定義するには、ClassName.PrimaryKeyPropertyを使用しますか?または、ナビゲーションプロパティを使用しますか?または両方?混乱した!!

更新2

だから、人間関係をうまく機能させるには、両側を定義する必要があります...私は思う。

Public Class Customer
    Public Property ID AS Integer
    Public Overrideable Property Locations AS ICollection(OF CustomerLocation)

End Class

Public Class CustomerLocation
    Public Property ID AS Integer
    Public Property CustomerID AS Integer

End Class
38
Sam

これは、カスケード削除の複数のパスがある場合にSQLサーバーによって引き起こされる例外です。 PaymentTermを削除すると、3つのリレーションすべてでカスケード削除がトリガーされます。これは、SalesOrderまたはInvoiceのいずれかを作成するときに爆発します。 EFは、デフォルトで_ON DELETE CASCADE_を使用してすべての1対多の関係を作成します。特定の関係を再マッピングして、使用しないようにすることができます。

_modelBuilder.Entity<...>()
            .HasRequired(...)
            .WithMany(...)
            .HasForeignKey(...)
            .WillCascadeOnDelete(false);
_

または、規則を削除して、グローバルに無効にすることができます。

_modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();   
_

特定の移行でこのエラーを回避するには、生成されたUp()メソッドを次のような行で編集します。

_AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true)
_

問題のある関係で_cascadeDelete:_値をfalseに変更します。

97
Ladislav Mrnka

this を読んでください。これが答えを見つけるのに役立つと確信しています。

また、ScottGuの blogpost によると、一般的には次のようにクラスを作成するだけでよいと思います(十分に読んでいなかったので、詳細を確認する必要があります)。

public class Customer
{
    public int CustomerID { get; set; }
    public int CustomerLocationID { get; set; }
    public virtual CustomerLocation Location { get; set; }
}

public class CustomerLocation
{
    public int CustomerLocationID { get; set; }
    public virtual ICollection<Customer> Customers { get; set; }
}
4
Shimmy