0

対処方法が本当にわからないという奇妙な動作が発生しています。エンティティが挿入された直後 (ExecuteDynamicInsert の直後) にエンティティを読み込もうとしていますが、部分メソッドが戻ると、常に System.Data.Linq.DuplicateKeyException "The database generated a key that is already in use. "。

非常に単純な例で達成しようとしているのは次のとおりです。

DataContext ファイル MyDataContext.cs:

public partial class MyDataContext
{
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
    {
        //using (TransactionScope ts = new TransactionScope())
        //{
            base.SubmitChanges(failureMode);
        //}
    }

    partial void InsertCountry(Country instance)
    {
        this.ExecuteDynamicInsert(instance);

        Country country = this.Countries.Where(c => c.CountryID == instance.CountryID).Single();
    }  //Exception occurs when this method returns...
}

プログラム ファイル Program.cs:

class Program
{
    static void Main(string[] args)
    {
        using (MyDataContext dataContext = new MyDataContext())
        {
            Country c = new Country()
            {
                Code = "C",
                CreatedBy = "Me",
                CreatedDate = DateTime.Now,
                ModifiedBy = "Me",
                ModifiedDate = DateTime.Now
            };

            dataContext.Countries.InsertOnSubmit(c);

            dataContext.SubmitChanges();
        }
    }
}

挿入後に国を読み取らなければ、コードは正常に機能しますが、何らかの理由で国を読み取る必要があり、ChangeSet を使用したくありません。

これを達成する方法、またはこの動作を回避する方法はありますか?

前もって感謝します。

4

4 に答える 4

0

私は以前にこのようなことが起こったことがあります。DataContextデザイナからCountryエンティティを削除して、再度追加してみてください。

于 2009-10-23T13:15:46.583 に答える
0

これと同じ例外がありました。私のインスタンスでは、ExecuteDynamicInsert の代わりに instance.ExecuteDynamicUpdate を使用していましたが、それは問題ではないと思います。

問題と思われるのは、挿入/更新内のオブジェクト階層内のオブジェクトに変更を加えると、このエラーが発生することです。私には、重複キーよりも楽観的同時実行性に関係しているように思えますが、マイクロソフトで働いていません...

オブジェクトのデータ コンテキストでSubmitChangesを呼び出す新しいメソッドをベース ビジネス オブジェクトに作成し、必要な変更を行うことで問題を解決しました。

あなたの場合、次のように Commit というメソッドを Country オブジェクトに追加してみてください。

public sub Commit(dc as MyDataContext)
 dc.SubmitChanges()
 Dim country as Country = dc.Countries.Where(function (c) c.CountryID = Me.CountryID).Single()
end sub

次に、Main で datacontext.SubmitChanges の代わりに c.Commit を呼び出します。

于 2010-08-26T14:51:07.223 に答える
0

同様の問題がありました。私の場合、デフォルトの INSERT をストアド プロシージャで上書きしましたが、主キーを設定するのを忘れていました。そのため、オブジェクトを挿入するたびに、重複キー エラーが発生しました。これは、すべてのオブジェクトが主キー 0 で戻ってくるためです。

于 2012-02-09T00:37:57.723 に答える
0

ExecuteDynamic[Insert|Update|Delete]を使用して既定の動作をオーバーライドする場合は、SubmitChangesを呼び出さないでください。ExecuteDynamic[...]は、DataContext のすぐ外部で変更を実装します。SubmitChangesを呼び出すときに変更を再度適用しようとしているため、例外が発生しています。

于 2010-01-03T18:29:20.853 に答える