当我更新数据库时,我必须对每个属性进行硬编码映射,因为使用附加结果会导致异常。这似乎并不太优雅。这里有一些比较简单的解决方案我不知道吗?我的代码如下,显示了我为此目的调用的“MapData”方法:
顺便说一句,实体类(这里;用户)是使用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(user,q)
无法使用已在使用的密钥添加实体。
ctx.Users.Attach(user,True)
如果实体声明版本成员或没有更新检查策略,则只能在没有原始状态的情况下附加为已修改的实体。
EDIT2:
我尝试添加一个列时间戳,我相信它应该满足最后提到的异常。所以我添加了这里显示的列。这没有用,但也许我需要进一步设置才能有效?
答案 0 :(得分: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();
}
}
}
}