【发布时间】:2011-02-04 08:28:09
【问题描述】:
当我更新数据库时,我必须硬编码每个属性的映射,因为使用附加会导致异常。这似乎不太优雅。这里有一些我不知道的更简单的解决方案吗?我的代码如下,显示了我为此目的调用的“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:
我尝试添加一个列时间戳,我认为它应该满足最后提到的异常。所以我添加了这里显示的列。这没有帮助,但也许我需要做一些进一步的设置才能有效?
【问题讨论】:
-
我使用该信息进行了编辑。
标签: sql sql-server database linq-to-sql sql-server-ce