【问题标题】:Save changes to Entity model to the database将实体模型的更改保存到数据库
【发布时间】: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


【解决方案1】:

原来我使用的是非静态(共享)Container. 我有 2 个 Manager 类,它们都继承自 BaseManager 类,并且定义了 Container。我在一个Manager 中执行查询命令并保存在另一个中。

哇!

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多