2017-03-10 5 views
1

円形の依存関係を生成する:EFコア複数のナビゲーションプロパティは、私は、次のマッピング構成を有する

エントリークラス:

entity 
    .HasOne(e => e.CurrentHandling) 
    .WithOne() 
    .HasForeignKey<Entry>(e => e.CurrentHandlingID) 
    ; 

entity 
    .HasMany(e => e.Handlings) 
    .WithOne(h => h.Entry) 
    .HasForeignKey(h => h.EntryID) 
    ; 

取り扱いクラス:

entity 
    .HasOne(h => h.Entry) 
    .WithMany(e => e.Handlings) 
    .HasForeignKey(h => h.EntryID) 
     .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict); 

ERM: enter image description here

私はコンテキストを保存しようとすると、私は次の例外を取得:

のSystem.InvalidOperationException:「循環依存関係が保存されるデータで検出されたため、変更を保存することができません。」のForeignKey:Entry.CurrentHandlingID - >をHandling.HandlingIDユニークなToPrincipal:CurrentHandling、ForeignKey:Handling.EntryID - > Entry.EntryID ToDependent:ハンドリングToPrincipal:Entry '。'

テストデータ:

errorRepo.EnableBulkModus(); 

var handling = errorRepo.AddHandling(new Handling { 
    CorrectedMessage = "correct", 
    HandlingStatusID = 7, 
    Updated = DateTime.UtcNow, 
    UpdatedBy = nameof(DbInitializer) 
}); 

var reference = errorRepo.AddReference(new Reference { 
    ForeignKeyTypeID = 4, 
    ForeignKeyValue = "42", 
    Name = "SystemB", 
    ReferenceTypeID = 6 
}); 

var entry = errorRepo.AddEntry(new Entry { 
    CurrentHandling = handling, 
    DisplayMessage = "Wrong!", 
    ErrorMessage = "error!", 
    Inserted = DateTime.UtcNow.AddMinutes(-5), 
    OriginalMessage = "incorrect", 
    InsertedBy = nameof(DbInitializer), 
    UUID = Guid.NewGuid(), 
    Reference = reference, 
    StatusID = 5 
}); 

handling.Entry = entry; 
entry.Handlings.Add(handling); 

errorRepo.DisableBulkModus(true); 

errorRepo.EnableBulkModus();セットだけフラグerrorRepo.DisableBulkModus(true);CommitChanges() 同じ呼び出したときに保存しないようリポジトリを示し、それはフラグをfalseに設定します。ブール値は、リポジトリがCommitChanges()を実行する必要があることを示しています。

循環依存性を避けるためにマッピングを変更する必要がありますか?

種類よろしく。

EDIT(2017年3月11日)

Iは取り扱いクラスのマッピングを除去し、エントリークラスの線.OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict)を追加:

entity 
     .HasMany(e => e.Handlings) 
     .WithOne(h => h.Entry) 
     .HasForeignKey(h => h.EntryID) 
     .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict) 
     ; 

同じ例外を:

System.InvalidOperationException: '循環依存関係が保存されるデータで検出されたため、変更を保存できません:' ForeignKey:Entry.Curr EntHandID - > Entry.EntryID ToDependent:HandLings ToPrincipal:Entry "。"

+0

EDIT(11.03.2017)を参照してください。 – Mario

答えて

4

この参照してください:1.以下のコードは、外部キーとしてhandlingの主キーを受け取るためにentryを必要

// 1. 
var entry = errorRepo.AddEntry(new Entry { 
    CurrentHandling = handling, 
    ... 
}); 
... 
// 2. 
handling.Entry = entry; 

を。 2の下のコードはhandlingがFKとしてentryの主キーを明らかにする必要があります:鶏と卵の問題です。

handlingentry(1-0.1の関係のため)に従うので、最初にCurrentHandlingプロパティが設定されていないentryを挿入する必要があります。変更を保存すると、entryは生成されたPKを知っています。次にentry.CurrentHandlinghandling.Entryを設定し、変更を再度保存します。

このコードをトランザクションにラップすることができます。

ところで、entry.Handlings.Add(handling);という行は冗長です。

+0

ありがとうございました。インサートの順序は問題を解決しました。さらに、CurrentHandling列にNULLを許可する必要がありました。 – Mario

関連する問題