0

データベース アクセスに Linq to SQL を使用する 2 つの C# Winform アプリケーションを使用しています。データベースへのアクセスとクエリはすべて、これらのアプリケーションの両方で参照および使用される DLL プロジェクトに存在します。最初のアプリケーションは、会計アプリケーションと SQL サーバー データベースの間でデータを同期します。2 番目のアプリケーションは、同じデータベース内のレコードの読み取り、書き込み、および更新を行います。現在、DataContext は、プログラムが終了するまでどちらのアプリケーションでも破棄されません。したがって、アプリケーション 1 (外部アプリと SQL DB の同期) とアプリケーション 2 (SQL DB の作成、読み取り、更新) はそれぞれ、コンテキストと DAO を含むデータベース ライブラリへの参照を持っています。DB アクセスが初めて必要になったときに、コンテキストのインスタンスがシングルトン内でインスタンス化されます。私が遭遇した例外とそれを再現する手順は以下のとおりです。

1) アプリケーション 1 を起動します。 2) アプリケーション 2 を起動します。 3) アプリケーション 1 を実行します。このアプリケーション 1 は、外部会計システムに基づいて SQL データベースのレコードを基本的に更新します。4) アプリケーション 1 によって変更されたレコードの 1 つを更新しようとする

以下の例外の列のマッピングは次のとおりです。

<Column Name="TimeStamp" Type="System.Data.Linq.Binary" DbType="rowversion NOT NULL" CanBeNull="false" IsVersion="true" />

また、更新チェックは決してしないように設定されています。より頻繁に DC を処分する方が良い設計かもしれないことは理解していますが、顧客がこのアプリケーションを使用しているため、それは当面の選択肢ではありません。この問題を解決する方法はありますか?

03/14/2013 15:18:08 Error BEN-LAPTOP Scribble.Database.Utilities.Domain.Persistence.Repository`1.SaveAll System.Collections.ListDictionaryInternal
03/14/2013 15:18:08 Error BEN-LAPTOP Scribble.Database.Utilities.Domain.Persistence.Repository`1.SaveAll Value of member 'TimeStamp' of an object of type 'Boat' changed.
A member that is computed or generated by the database cannot be changed.
03/14/2013 15:18:08 Error BEN-LAPTOP Scribble.Database.Utilities.Domain.Persistence.Repository`1.SaveAll    at System.Data.Linq.ChangeProcessor.CheckForInvalidChanges(TrackedObject tracked)
   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at Scribble.Database.Utilities.DomainClassesDataContext.Submit(RefreshMode refreshMode) in C:\Aaron\Dev\ScribbleUtilityProjects\Scribble.Database.Utilities\DomainClasses.cs:line 42
   at Scribble.Database.Utilities.DomainClassesDataContext.SubmitOverwriteDatabase() in C:\Aaron\Dev\ScribbleUtilityProjects\Scribble.Database.Utilities\DomainClasses.cs:line 19
   at Scribble.Database.Utilities.Domain.Persistence.Repository`1.SaveAll() in C:\Aaron\Dev\ScribbleUtilityProjects\Scribble.Database.Utilities\Domain\Persistence\Repository.cs:line 79
03/14/2013 15:18:08 Error BEN-LAPTOP MarineService.GlobalCollections.showAndLogErrors Value of member 'TimeStamp' of an object of type 'Boat' changed.
A member that is computed or generated by the database cannot be changed.
03/14/2013 15:18:08 Error BEN-LAPTOP MarineService.GlobalCollections.showAndLogErrors    at Scribble.Database.Utilities.Domain.Persistence.Repository`1.SaveAll() in C:\Aaron\Dev\ScribbleUtilityProjects\Scribble.Database.Utilities\Domain\Persistence\Repository.cs:line 101
   at Scribble.Database.Utilities.Domain.Persistence.Repository`1.UpdateEntity(T entity, Boolean attach) in C:\Aaron\Dev\ScribbleUtilityProjects\Scribble.Database.Utilities\Domain\Persistence\Repository.cs:line 50
   at MarineService.Tests.AddWorkOrderForm.SaveWorkOrder() in C:\Aaron\Dev\ScribbleApplicationProjects\PureService\AddWorkOrderForm.cs:line 1638
4

1 に答える 1

2

コンテキストをシングルトンにしたくありません。MSDNの DataContext ページから:

一般に、DataContext インスタンスは 1 つの「作業単位」の間存続するように設計されていますが、アプリケーションではその用語を定義しています。DataContext は軽量で、作成に費用がかかりません。一般的な LINQ to SQL アプリケーションは、メソッド スコープで、または関連するデータベース操作の論理セットを表す有効期間が短いクラスのメンバーとして、DataContext インスタンスを作成します。

于 2013-03-14T20:35:30.253 に答える