【发布时间】:2011-11-11 18:38:33
【问题描述】:
我是 Entity Framework 的新手,正在扩展现有的代码库。我正在使用 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 是我尝试查看是否实际保存了更改。它似乎工作正常,因为 playerAfter.FirstName 是新更新的名字。
PlayerAdminManager.GetPlayerById(integer) 从数据库中提取,所以我认为,由于在playerAfter 中观察到更改,因此这些更改已保存到数据库中。但是,当我重新加载网页(从数据库中提取)时,旧值仍然存在。
有什么想法吗?
以下是我提到的一些功能:
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
编辑
容器代码:
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
【问题讨论】:
-
Container 是 DataContext 的静态实例还是缓存实例?能否展示一下创建和存储Container相关的代码?
-
@wonkim00 - 这就是你所需要的吗?
-
是的,这就是我要找的东西,但我看不出有什么问题。我不认为这是 DataContext 生命周期管理问题——它被创建和缓存,随后对 PlayerAdminManager 上的方法的调用使用缓存的实例,因此更改跟踪应该处于活动状态,并且不需要附加修改后的对象。对不起。
-
感谢您的浏览。附加修改后的对象是什么意思? (我对 Entity 框架完全陌生)
-
How to update a detached entity in Entity Framework 我还要确认,当您重新加载页面时,正在创建一个全新的 DataContext。在 Container getter 中放置一个断点。如果它以某种方式使用缓存副本,那么在实体上调用 Refresh() 可能会有所帮助。
标签: asp.net database entity-framework