我是实体框架的新手,并且正在扩展现有的代码库。我使用jQuery将所需的信息传递回服务器ajaxy样式,因此我不能使用TryUpdateModel()
。下面的代码:将对实体模型的更改保存到数据库
<HttpPost()>
Function UpdateRoster() As JsonResult
Dim model As New Models.ViewModels.PlayerAdmin
Dim jsonString As String = Request.Form("json")
model = Deserialise(Of Models.ViewModels.PlayerAdmin)(jsonString)
For Each playerAdminPlayer As Models.ViewModels.PlayerAdminPlayer In model.Roster
Dim playerToTeam As New DAL.PlayersToTeam
Dim player As DAL.Player = PlayerAdminManager.GetPlayerById(playerAdminPlayer.PlayerId)
player.FirstName = playerAdminPlayer.FirstName
PlayerAdminManager.SaveChanges()
Next playerAdminPlayer
Dim playerAfter As DAL.Player = PlayerAdminManager.GetPlayerById(model.Roster.First.PlayerId)
Return Json(New With {.success = False, .message = playerAfter.FirstName})
End Function
Deserialise
是一个辅助功能是将输入的JSON字符串到VB对象。
事情似乎正常工作player
成功从数据库加载和playerAdminPlayer
是来自JSON字符串的正确对象。然而,当我打电话给PlayerAdminManager.SaveChanges()
(它只是通过调用db.SaveChanges()时,结果始终为0,即使有变化(不确定是否有此变化)也不知道是否应该这样做。变化实际上被保存,它似乎正常工作,在playerAfter.FirstName
是最近更新的名字。从数据库
PlayerAdminManager.GetPlayerById(integer)
拉,所以我会认为,因为变化在playerAfter
观察到,这些变化被保存到DB。然而,当我重新加载网页(从DB拉),旧值在那里。
任何想法?
下面是一些功能我提到:
Function GetPlayerById(ByVal Id As Integer) As DAL.Player
Return Container.Players.Where(Function(o) o.PlayerId = Id And o.IsVisible = True).SingleOrDefault
End Function
Sub SaveChanges()
Dim numberOfChanges As Integer = Container.SaveChanges()
Debug.WriteLine("No conflicts. " & numberOfChanges.ToString() & " updates saved.")
End Sub
EDIT
集装箱代码:
Private _Container As DAL.LateralSportsContainer
Protected ReadOnly Property Container As DAL.LateralSportsContainer
Get
If _Container Is Nothing Then
Dim connStr As New System.Data.EntityClient.EntityConnectionStringBuilder
connStr.ProviderConnectionString = Web.Configuration.WebConfigurationManager.ConnectionStrings("ApplicationServices").ConnectionString
connStr.Metadata = "res://*/Lateral.csdl|res://*/Lateral.ssdl|res://*/Lateral.msl"
connStr.Provider = "System.Data.SqlClient"
_Container = New DAL.LateralSportsContainer(connStr.ConnectionString)
End If
Return _Container
End Get
End Property
容器是你的DataContext的静态或缓存实例?您能否显示与创建和存储Container相关的代码? – wonkim00
@ wonkim00 - 是你需要的吗? –
是的,这就是我正在寻找的东西,但我看不出有什么不对。我不认为这是一个DataContext生存期管理问题 - 它被创建并缓存,随后对PlayerAdminManager上方法的调用使用缓存实例,所以更改跟踪应该处于活动状态,并且不需要附加修改后的对象。抱歉。 – wonkim00