0

したがって、論理的には機能するはずのこのコードがありますが、EntityFrameworkは予期しない動作をしています。

ここ:

foreach (SomeClass someobject in allObjects)
{
    Supplier supplier = new Supplier();

    supplier.primary_key = someobject.id;
    supplier.name = someobject.displayname;

    try
    {
       sm.Add(supplier);
       ro.Created++;
    }
    catch (Exception ex)
    {
       ro.Error++;
    }
}

これが私がsm.Add()に持っているものです

    public Supplier Add(Supplier supplier)
    {
        try
        {
            _ctx.AddToSupplier(supplier);
            _ctx.SaveChanges();
             return supplier;
        }
        catch (Exception ex)
        {
            throw;
        }
    }

同じIDを持つallObjectsにレコードを含めることができます。私のコードはこれをサポートする必要があり、次のコードに進んで挿入してみてください。これでうまくいくと思います。

これが発生した場合、例外がスローされ、重複したPKを持つレコードは挿入できません(もちろん)。例外は、PKの値(たとえば1000 )に言及しています。

すべて順調です。これまで使用されたことのないPKを含む新しいサプライヤsm.Add()に渡されます。1001

ただし、奇妙なことに、SaveChanges()を実行すると、EFは重複したPKを持つレコードを挿入できないことについて泣き言を言います。サプライヤのprimary_keyに1001が含まれている場合でも、例外は1000に言及しています。

これは私が_ctxを適切に使用していないことだと思います。同期するために他の何かを呼び出す必要がありますか?

4

1 に答える 1

0

それを見つけ、Add()メソッドで何かを変更する必要がありました:

public Supplier Add(Supplier supplier)
{
    try
    {
        _ctx.AddToSupplier(supplier);
        _ctx.SaveChanges();
         return supplier;
    }
    catch (Exception ex)
    {
        _ctx.Supplier.Detach(supplier);
        throw;
    }
}
于 2012-11-21T17:29:54.513 に答える