2011-01-11 14 views
0

データベースを更新するときに、アタッチ結果を例外として使用するため、各プロパティのハードコードマッピングを行う必要があります。これはあまりにもエレガントではないようです。私が気づいていないここで簡単な解決策がありますか?私のコードはこの目的のために呼び出す "MapData"メソッドを示しています。SqlCEデータベースの更新Linq-to-SQL

Btw、エンティティクラス(ここでは、Users)はSqlMetalで自動生成されます。

Public Class UserDataService 

    Public Sub Save(ByVal user As Users) 
     Dim ctx As New TestDB(connection) 
     Dim id As Integer = user.Id 

     If user.Id = 0 Then 
      Insert(user) 
     Else 
      Dim q = (From n In ctx.Users Where n.Id = id Select n).Single 
      q.MapData(user) 
      For Each o In user.Orders 
       o.Save() 
      Next 

      ' ctx.Users.Attach(user, q)    ' Does not work 
      ' ctx.Users.Attach(user, True)   ' Does not work 

     End If 

     ctx.SubmitChanges() 
     ctx.Dispose() 
    End Sub 

End Class 

Partial Public Class Users 

    Public Sub MapData(ByVal row As Users) 
     Me.Name = row.Name 
    End Sub 

End Class 

EDIT1:

例外:

ctx.Users.Attach(ユーザー、Q)

がすでにあるキーを持つエンティティを追加することはできませんつかいます。元の状態なしで修正され、それはバージョンメンバを宣言または更新チェックポリシーを持っていない場合

ctx.Users.Attach(ユーザ、TRUE)

エンティティにのみ取り付けることができます。


EDIT2:

私は最後に述べた例外を満たすことになっていると信じて、列のタイムスタンプを、追加しようとしました。そこでここに示す列を追加します。これは助けにはなりませんが、おそらく私はそれを有効にするためにいくつかの設定を行う必要がありますか?

+0

あなたは何の例外を得るのですか? – SLaks

+0

その情報で編集しました。 – bretddog

答えて

0

このように動作するはずです:

ctx.Users.Attach(user) 
ctx.Refresh(RefreshMode.KeepCurrentValues, user)  'this line is important 
ctx.SubmitChanges() 

しかしこれはC#で、私のコンソールのテストアプリケーションは、(それが動作)、されています

class Program 
    { 
     public static void Main(string[] args) 
     { 
      var t = new Test(); 

      Customer c = t.GetCustomer(); 
      c.CompanyName = "X"; 
      t.AttachCustomer(c); 
     } 


     class Test 
     { 
      public Customer GetCustomer() 
      { 
       Customer cust; 
       using(DataContext db = new DataContext()) 
       { 
        cust = db.Customers.Where(x => x.CustomerID == "ALFKI").Single(); 
        db.Dispose(); 
       } 
       return cust; 
      } 


      public void AttachCustomer(Customer cx) 
      { 
       using (DataContext db = new DataContext()) 
       { 
        db.Customers.Attach(cx); 
        db.Refresh(RefreshMode.KeepCurrentValues, cx); 
        db.SubmitChanges(); 
        db.Dispose(); 
       } 
      } 
     } 
    } 
関連する問題