SaveChanges を呼び出すと、json を逆シリアル化して作成されたオブジェクト グラフがあります。
Violation of PRIMARY KEY constraint 'PK_dbo.Pickles'. Cannot insert duplicate key in object 'dbo.Pickles'. The duplicate key value is (P1).
The statement has been terminated.
例外が発生する理由は理解していますが、グラフを追加する良い方法を考えていません。
以下は、この問題の小さなスタンドアロンの再現です。
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using NUnit.Framework;
namespace Tempy
{
public class DbTests
{
private Unicorn _u1 = new Unicorn { Id = "U1" };
private Unicorn _u2 = new Unicorn { Id = "U2" };
private Pickle _p1 = new Pickle { Id = "P1" };
private Pickle _p2 = new Pickle { Id = "P2" };
[SetUp]
public void SetUp()
{
using (var context = new TempContext())
{
if (context.Database.Exists())
context.Database.Delete();
context.Database.CreateIfNotExists();
}
}
[Test]
public void InsertTest()
{
_u1.Pickles.UnionWith(new[] { _p1, _p2 });
_u2.Pickles.UnionWith(new[] { _p1, _p2 });
using (var context = new TempContext())
{
context.Unicorns.Add(_u1);
context.Unicorns.Add(_u2);
context.SaveChanges();
}
}
[Test]
public void InsertFailsTest()
{
_u1.Pickles.UnionWith(new[] { _p1, _p2 });
_u2.Pickles.UnionWith(new[] { new Pickle { Id = _p1.Id }, _p2 });
using (var context = new TempContext())
{
context.Unicorns.Add(_u1);
context.Unicorns.Add(_u2);
Assert.Throws<DbUpdateException>(()=>context.SaveChanges()); //Is there a nice way to get this to work?
}
}
}
public class TempContext : DbContext
{
public DbSet<Pickle> Pickles { get; set; }
public DbSet<Unicorn> Unicorns { get; set; }
}
public class Pickle
{
public string Id { get; set; }
private readonly ISet<Unicorn> _unicorns = new HashSet<Unicorn>();
public virtual ISet<Unicorn> Unicorns { get { return _unicorns; } }
}
public class Unicorn
{
public string Id { get; set; }
private readonly ISet<Pickle> _pickles = new HashSet<Pickle>();
public virtual ISet<Pickle> Pickles { get { return _pickles; } }
}
}
これは重複しているように感じますが、うまく検索できませんでした。
質問: このグラフを追加する良い方法は何ですか?