2

次のような 2 つのエンティティがあります。

public class AssetSession
{
   [Key]
   public Guid Id { get; set; }
   public string RoomNumber { get; set; }
   public Contact Contact { get; set; }
   public virtual List<Asset> Assets { get; set; }
}

public class Asset
{
   [Key]
   public Guid Id { get; set; }
   public Guid? ParentId { get; set; }
   [ForeignKey("ParentId")]
   public Asset Parent { get; set; }
   public string Barcode { get; set; }
   public string SerialNumber { get; set; }
   public Guid AssetSessionId { get; set; }
   [ForeignKey("AssetSessionId")]
   public AssetSession AssetSession { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Asset>()
      .HasOptional(t => t.Parent)
      .WithMany()
      .HasForeignKey(t => t.ParentId);
}

アセットと対多の関係を持つ AssetSession。最近、Asset に自己参照エンティティ (Parent と呼ばれる) を導入するまで、すべてが正常に機能していました。

私の問題は、新しい AssetSession レコードを挿入するときにいくつかの SQL プロファイリングを行った後、EF が AssetSession に存在しない FK を参照するアセットを最初に挿入しようとしているように見えるため、次のエラーが発生する理由です。

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Assets_dbo.AssetSessions_AssetSessionId"

エラーは一目瞭然ですが、Assets が正しい AssetSession を参照するために、最初に AssetSession を作成することによって INSERT ステートメントの順序が開始されない理由がわかりません。

挿入するための私のコードは次のようになります。

using (var context = new AssetContext())
{
   var assetSession = jsonObject; // jsonObject being passed into the method

   var existingSession = context.AssetSessions.FirstOrDefault(c => c.Id == assetSession.Id);

   if (existingSession == null)
   {
      var existingContact = context.Contacts.FirstOrDefault(c => c.Id == assetSession.Contact.Id);

      if (existingContact != null)
      {
         context.Contacts.Attach(existingContact);
         assetSession.Contact = existingContact;
      }

      context.Entry(assetSession).State = EntityState.Added;
      context.SaveChanges();    
   }
}
4

1 に答える 1

1

EFを使用した外部キ​​ーでも同じエラーが発生しました。関連していないかもしれませんが、提供された回答は、エラーが発生した理由を理解するのに役立ちました。

EF と外部キーの問題

Slauma の回答を要約すると、EF 挿入の前に垂直方向のナビゲーション値をクリアしていました。これにより問題が発生しましたが、これは別の問題ですが、役立つ可能性があります。

考えられる解決策

すべての AssetSession オブジェクトを Asset オブジェクトに移動し、1 つのルート追加を行うと、EF が両方を正しく挿入できるようになります。

注: これを行うには、オブジェクトを挿入する前に GUID を生成する必要がある場合があります。

于 2014-02-19T23:10:05.587 に答える