4

LINQ to SQL データ アクセス レイヤーとして汎用リポジトリに update メソッドを作成しようとしています。

次のようなエンティティがあります。

[Table]
public class Product
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, 
     DbType = "Int NOT NULL IDENTITY")]
    public int Id { get; private set; }
    [Column(UpdateCheck = UpdateCheck.Never)]
    public string Name { get; set; }
    ....
}

Update Check = true@jeff Atwood がこの投稿で提案しているように、id を除くすべてのフィールドを設定し、この投稿で次のようasModifiedに見つけた attach メソッドのプロパティを trueに設定しました。

public void Update(T entity)
{
    _db.GetTable<T>().Attach(entity, true); 
    _db.SubmitChanges();
}

しかし、私は同じ例外を受け取り続けます:

エンティティは、バージョン メンバーを宣言するか、更新チェック ポリシーを持たない場合にのみ、元の状態なしで変更されたものとして添付できます。

だから問題は何ですか ???

タイムスタンプ列をバージョン番号として作成する以外に、汎用リポジトリで更新メソッドを作成する他の方法をお勧めしますか?

4

2 に答える 2

2

同じ問題を解決するために、DAO で次のコードを使用しました

public void UpdateUser(tblUser user)
{
   WriteDataContect.Attach
   (
      user,
      ReadOnlyDataContext.tblUsers
                         .Select(o => o.UserId == user.UserId)
   );
   WriteDataContext.SubmitChanges();
}

ReadOnlyDataContext には TrackChanges = false があります。

多くの配管コードを書かなくても、私たちのニーズに基づいた別のソリューションを見つけることができませんでした。タイムスタンプ列に対する LinqToSql のニーズに対応するためにデータベースを変更することも、私たちの選択肢ではありませんでした。

追加の DB 呼び出しは、テストでは問題を引き起こしませんでした。

于 2011-12-26T05:32:49.337 に答える
0

dbからエンティティを読み取り、フィールドをコピーできます。私はこのアプローチが好きではありませんが、同様の問題に対処するときはそれをしなければなりませんでした。

オブジェクトが以前にコンテキストにロードされたことがないかどうかはわかりません。ロードされた場合は、とにかくアタッチしたときに例外が発生します。少なくともEFの場合はそうですが、SQLのlinqでも論理的です。

于 2011-11-03T11:06:42.067 に答える