2011-01-11 122 views
0

当我更新数据库时,我必须对每个属性进行硬编码映射,因为在附加结果中使用了异常。这看起来不太优雅。这里有一些更简单的解决方案,我不知道吗?我的代码如下,显示我为此调用的“MapData”方法:更新SqlCE数据库Linq-to-Sql

顺便说一句,实体类(这里;用户)是用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(用户,真)

实体只能连接。


EDIT2:

我尝试添加一列时间戳,我相信要满足最后提到的例外。所以我添加这里显示的列。这没有帮助,但也许我需要进一步的设置才能有效?

+0

你什么异常? – SLaks 2011-01-11 14:14:09

回答

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(); 
       } 
      } 
     } 
    }