0

と呼ばれる次のエンティティクラスがありますCode。さまざまな種類のカテゴリが保存されます。データは、ユーザー カテゴリ、経費カテゴリ、住所タイプ、ユーザー タイプ、ファイル形式など、多くの小さなテーブルを作成するために必要でした。

public class Code
{
    public int Id { get; set; }
    public string CodeType { get; set; }
    public string CodeDescription { get; set; }


    public virtual ICollection<Expense> Expenses { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
                   :
                   : // many more

}

クラスExpenseは次のようになります。

public class Expense
{
    public int Id { get; set; }

    public int CategoryId { get; set; }
    public virtual Code Category { get; set; }

    public int SourceId { get; set; }

    public double Amount { get; set; }
    public DateTime ExpenseDate { get; set; }
}

上記のクラス定義により、マッピングCodeExpense使用してと の間に 1 対多の関係を確立しました。CategoryId

私の問題は、SourceIdフィールドをExpenseオブジェクトCodeにマップしたいということです。つまり、Expenseオブジェクトには含まれます

public Code Source { get; set; }

これを使用すると、実行時に循環依存関係に関するエラーが発生します。

誰か助けてくれませんか?

4

1 に答える 1

0

2 つの関係の少なくとも 1 つ (または両方) でカスケード削除を無効にする必要があります。EF では、外部キー プロパティが null 許容ではないため、両方のリレーションシップが必要であるため、慣例により両方のリレーションシップのカスケード削除を有効にします。ただし、SQL Server は、2 つのリレーションシップによって導入される同じテーブルへの複数のカスケード削除パスを受け入れません。それがあなたの例外の理由です。

Fluent API で規則をオーバーライドする必要があります。

public class Code
{
    public int Id { get; set; }
    //...
    public virtual ICollection<Expense> Expenses { get; set; }
    //...
}

public class Expense
{
    public int Id { get; set; }

    public int CategoryId { get; set; }
    public virtual Code Category { get; set; }

    public int SourceId { get; set; }
    public virtual Code Source { get; set; }
    //...
}

Fluent API によるマッピング。

modelBuilder.Entity<Expense>()
    .HasRequired(e => e.Category)
    .WithMany(c => c.Expenses)
    .HasForeignKey(e => e.CategoryId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Expense>()
    .HasRequired(e => e.Source)
    .WithMany()
    .HasForeignKey(e => e.SourceId)
    .WillCascadeOnDelete(false);
于 2012-11-03T19:37:18.547 に答える