【问题标题】:Foreign keys updating on creation but not on edit外键在创建时更新但在编辑时不更新
【发布时间】:2013-05-10 13:01:14
【问题描述】:

在我的应用程序中,可以为用户分配角色。在此设置页面中,我有以下代码:

foreach (string userRole in roleArray)
{
    OrganizationRole orgRole = signedUpOrg.Roles.FirstOrDefault(target => target.Name == userRole && target.OrganizationId == signedUpOrg.OrganizationId);
    if (orgRole != null)
    {
        OrganizationUser_OrganizationRole existingUserRole = orgRole.OrganizationUser_OrganizationRole.FirstOrDefault(target => target.Organization_User.User.UserId    == orgUser.User.UserId &&
                                                                                                                                target.OrganizationRole.Name            == userRole && 
                                                                                                                                target.OrganizationRole.OrganizationId  == signedUpOrg.OrganizationId);

        if (existingUserRole == null || orgUser.User.UserId == 0) // new user role to new users or existing users with new roles
        {
            orgRole.OrganizationUser_OrganizationRole.Add(new OrganizationUser_OrganizationRole
            {
                Organization_User   = orgUser,
                OrganizationRole    = orgRole
            });
        }
    }
}

这样,我们可以循环分配要分配的角色并将它们保存在数据库中。这在创建用户及其角色时非常有效,但在编辑时没有任何变化。代码似乎在所有关键点都被正确的数据(角色等)击中,但在数据库或前端没有反映。

此代码位于名为 CommonUtilities 的类中名为 SaveUsers 的方法中,并在 AdministrationController 中使用以下代码调用:

CommonUtilities.SaveUsers(viewModel);

谁能想到为什么这会在创建时正常工作但在编辑时不能正常工作?非常感谢,我非常愿意澄清任何问题。

【问题讨论】:

  • 这与您在创建新用户时使用的代码相同吗?还是只是为了更新?
  • 能否提供SaveUsers方法中的代码?您使用的是 EF 还是 ADO?
  • @SOfanatic 这是在我的管理员用户可以使用的快速帐户设置页面中创建和更新用户的相同代码。它适用于创建,但不适用于更新。
  • @NickChambers 我没有看到你在哪里调用你的上下文的 SaveChanges。但是好的,看看这个链接是否可以帮助你stackoverflow.com/questions/4728212/… AND stackoverflow.com/questions/4075107/…
  • 就像@JhonatasKleinkauff 所说,不确定您的方法如何成功添加新用户,似乎没有在任何地方调用context.SaveChanges()

标签: c# asp.net sql asp.net-mvc-3


【解决方案1】:

一个类似的问题促使我选择 NHibernate 而不是 EF,因为它可以更新子孙集合(可能更深层次,但我没有尝试过)。像@JhonatasKleinkauff 提到的答案一样调整 ObjectState 似乎是 EF 中的唯一答案,但在我们的案例中并不令人满意。这似乎只发生在您在检索和保存父对象之间与 ObjectContext 断开连接时。

【讨论】:

  • 是的,这似乎是一个问题,因为我们不久前升级了我们的 EF,所以我不确定我们是否只是远远落后于时代,或者这是最近的变化,但它肯定是刺激!在某些情况下,我们似乎确实在应用“SetAsModified”(正如我最新的评论所示),但也许我们错过了一个必要的。感谢您的帮助!
猜你喜欢
  • 2019-06-22
  • 2013-07-14
  • 1970-01-01
  • 2015-03-05
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
相关资源
最近更新 更多