2011-11-11 182 views
0

我是实体框架的新手,并且正在扩展现有的代码库。我使用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 
+0

容器是你的DataContext的静态或缓存实例?您能否显示与创建和存储Container相关的代码? – wonkim00

+0

@ wonkim00 - 是你需要的吗? –

+0

是的,这就是我正在寻找的东西,但我看不出有什么不对。我不认为这是一个DataContext生存期管理问题 - 它被创建并缓存,随后对PlayerAdminManager上方法的调用使用缓存实例,所以更改跟踪应该处于活动状态,并且不需要附加修改后的对象。抱歉。 – wonkim00

回答

0

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

Doh!

相关问题