2010-05-05 64 views
0

我想不通,为什么在不改变的对象我重视的SaveChanges调用()以下代码结果:实体框架:附加实体没有保存

public void Update() 
{ 
AccountUser accountUser = new AccountUser(); 

// update 
using (var db = new MedicalSystemDBEntity()) 
{ 
    var query = from user in db.AccountUsers 
       where user.id == this.UserID 
       select user; 

    if (query.Count() > 0) 
    { 
     accountUser = query.First(); 

     accountUser.AccountRoles.Load(); 
     accountUser.SecurityNavigationNodes.Load(); 

     // delete existing user roles before re-attaching 
     if (accountUser.AccountRoles.Count > 0) 
     { 
      foreach (AccountRole role in accountUser.AccountRoles.ToList()) 
      { 
       accountUser.AccountRoles.Remove(role); 
      } 
     } 

     db.SaveChanges(); 

     // get roles to add 
     List<int> roleIDs = new List<int>(); 

     foreach (UserRole r in this.AccountRoles) 
     { 
      roleIDs.Add(r.RoleID); 
     } 

     var roleEntities = from roles in db.AccountRoles 
          where roleIDs.Contains(roles.id) 
          select roles; 

     accountUser.AccountRoles.Attach(roleEntities); 

     accountUser.username = this.Username; 
     accountUser.firstname = this.FirstName; 
     accountUser.middlename = this.MiddleName; 
     accountUser.lastname = this.LastName; 
     accountUser.enabled = this.Enabled; 

     if (this.LastActivityDate != null || this.LastActivityDate != DateTime.MinValue) 
      accountUser.lastactivitydate = this.LastActivityDate; 

     db.SaveChanges(); 
    } 
} 

}

在调试程序,我看到正在加载正确的roleEntities,并且它们是有效的对象。但是,如果我使用SQL事件探查器,则看不到UPDATE或INSERT查询,结果没有保存我的连接对象。

+0

记住我不是想添加一个新用户,我也不想添加一个新的帐户角色......我只想将accountUser与一组新的AccountRoles相关联(这里有一个多对多的帐户) AccountRoles和AccountUsers之间通过连接表有很多关系) – 2010-05-05 19:19:34

+0

在你的例子中,请指定你的上下文范围和生命周期。例如。通过定义“using()...”块。您使用'accountUser',但我们无法知道该对象正在发生什么。另外,尽量不要在代码片段中使用'var':) – kervin 2010-05-05 19:25:34

+0

Kervin:我现在已经添加了一个更大的代码示例:)这是我的第一个Stackoverflow文章,非常抱歉。 – 2010-05-05 19:29:28

回答

3

他们没有保存,因为您在附加它们之前更改实体。上下文(通常)跟踪更改,因此不会跟踪对已分离实体的更改。因此,没有什么可以保存。

+0

好吧,我并没有试图改变角色本身......我试图改变与用户相关的角色。也许我误解了一些东西? 用户和帐户角色使用连接表具有多对多关系。连接表不能直接访问,因为它构成了导航属性(对吗?)。因此,向用户添加新角色应在此表中添加一个条目。 – 2010-05-05 19:17:44

0

关闭我的头顶,不应该在从帐户中删除角色后执行SaveChanges()?你不只是删除附加到用户的角色,然后重新附加相同的角色?既然保存了这些变化,它会不会改变呢?

+0

我尝试在删除后调用SaveChanges(),然后在重新连接后再次调用SaveChanges()。事情是,我将删除旧的角色并添加新的角色。可能会有更多,更少或不同的角色正在重新安装,而不是之前的那些角色。 例如,用户可能没有角色,但在重新连接时可能会向用户添加新角色。 – 2010-05-05 19:16:26

+0

那么,如果你删除不应该在做db.DeleteObject(角色),而不是从上下文中删除它们? – Paul 2010-05-05 19:21:27

+0

我试着做一个DeleteObject,但是删除了角色...我希望角色保持原样,因为它可能与其他用户相关联......我只想要AccountUser的帐号关联关系被删除。在普通的SQL中,我只是删除表中连接AccountUser和AccountRole的条目。我并没有试图去除实际的角色本身 – 2010-05-05 19:23:35

0

有时它是因为授权对象在分离时被修改。文章here将显示如何清除该问题。