gpt4 book ai didi

c# - Linq 到 SQL : Relations not correctly updated

转载 作者:行者123 更新时间:2023-11-30 12:52:36 27 4
gpt4 key购买 nike

问题总结:

使用相同的 DataContext 插入和更新与多个角色有关系的用户,这些关系在我的 LinqToSql 类中没有正确更新(但在数据库中没问题)。使用一个 DataContexts 插入和另一个更新工作正常。

详细说明:

我的数据库中有一个用户表和一个角色表。为了在它们之间建立多对多关系,我还有一个 UserRoleRelation 表(有两个指向 User.ID 和 Role.ID 的外键)。

我有一个测试,其中创建了一个用户并向该用户添加了两个角色(AB)。然后我删除角色 A 并添加新角色 C 并更新用户。

但是当我随后在数据库中选择用户时(通过 DataContext.Users.Where(p => p.ID.equals(user.id)).FirstOrDefault())然后用户只有一个 UserRoleRelation(到角色 A)!但是数据库中的一切都很好 - AC 角色都与用户相关。

我正在使用 Web 服务,因此使用了存储库模式 - 对于每个服务调用,我都创建了一个新的 DataContext - 然而,同一个服务可能会不止一次地使用同一个对象(例如用户、用户角色关系或角色),以便它们已经被附加到 DataContext - 所以当我将对象附加到 DataContext 时,我捕获了潜在的 InvalidOperationExceptions(例如,该对象已经附加)并忽略它们。

在我的测试中,我使用相同的 DataContext 来插入和更新用户 - 但是,如果我使用两个不同的 DataContext,那么它工作正常 - 从数据库中正确检索用户!

所以出于某种原因,DataContext 中的缓存被搞乱了。

这是我的 UpdateUser 方法:

private User UpdateUser(User user)
{
foreach (UserRoleRelation relation in user.UserRoleRelations)
{
if (relation.Role != null)
{
TryAttach(DataContext.Roles, relation.Role); // same as DataContext.Roles.Attach(relation.Role)
}
}
// attach the new user as modified
TryAttach(DataContext.Users, user, true); // same as DataContext.Users.Attach(user, true), but is that the correct way to do it?

// update the relations (figure out which are removed, added and unchanged)
IEnumerable<UserRoleRelation> oldRelations = DataContext.UserRoleRelations.Where(p => p.UserID.Equals(user.ID)).ToList();

// mark for deletion (those elements that are in the old list, but not in the new)
IEnumerable<UserRoleRelation> deletionList = oldRelations.Except(user.UserRoleRelations, userRoleRelationComparer).ToList();
DataContext.UserRoleRelations.DeleteAllOnSubmit(deletionList);

// mark for insert (those that are in the new list, but not in the old)
IEnumerable<UserRoleRelation> insertionList = user.UserRoleRelations.Except(oldRelations, userRoleRelationComparer).ToList();
DataContext.UserRoleRelations.InsertAllOnSubmit(insertionList);

// attach the rest as unmodified (those that are in both lists)
IEnumerable<UserRoleRelation> unmodifiedList = oldRelations.Intersect(user.UserRoleRelations, userRoleRelationComparer).ToList();
TryAttachAll(DataContext.UserRoleRelations, unmodifiedList);

DataContext.SubmitChanges();

// return the updated user (in order to be sure that all relations are update, we fetch the user from the DB)
User updatedUser = GetUser(user.Email); // same as DataContext.Users.Where(p => p.Email.Equals(user.Email)).FirstOrDefault();
return updatedUser;
}

我做错了什么? - 我很确定当我在测试中使用相同的 DataContext 时,“将用户附加到 DataContext”会引发异常(它已经附加),这可能就是我没有得到正确关系的原因 -但是 LinqToSql 应该能够发现关系的变化...

最佳答案

我认为问题不在于 Update 方法,而在于“DataContext.Users.Where(p => p.ID.equals(user.id)).FirstOrDefault()”,您使用的是 FirstorDefault() 和 linq仅返回第一条记录。尝试删除 FirstOrDefault() 并将结果保存在数组中...

关于c# - Linq 到 SQL : Relations not correctly updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4276079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com