3

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; } }
    }
}

これは重複しているように感じますが、うまく検索できませんでした。

質問: このグラフを追加する良い方法は何ですか?

4

1 に答える 1

0

ID を生成する必要があります。この注釈を ID の上に置きます。

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]

詳細については、この関連する質問を参照してください

于 2013-08-09T12:30:29.053 に答える