gpt4 book ai didi

database - Linq to Sql - 如何使用存储库模式更新对象?

转载 作者:搜寻专家 更新时间:2023-10-30 23:22:21 24 4
gpt4 key购买 nike

有大量关于此的信息,但即使阅读了几个小时后,我似乎也无法按照我想要的方式使用它。

我试图通过传入一个用户对象来更新一个用户对象,并将更改与我从数据库中提取的用户对象进行一般比较。使用此方法时,我总是以 NotSupportedException 告终:

An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.

下面是我尝试的方法:

    public void SaveUser(User User)
{
using (DataContext dataContext = new DataContext(WebConfigurationManager.ConnectionStrings["database"].ConnectionString))
{
// New user
if (User.UserID == 0)
{
dataContext.Users.InsertOnSubmit(User);
}
// Existing user
else
{
User dbUser = dataContext.Users.Single(u => u.UserID.Equals(User.UserID));
Type t = dbUser.GetType();
foreach (PropertyInfo p in t.GetProperties())
{
if (p.CanWrite & p.GetValue(dbUser, null) != p.GetValue(User, null))
{
p.SetValue(dbUser, p.GetValue(User, null), null);
}
}
//dataContext.Refresh(RefreshMode.KeepCurrentValues, dbUser);
}
dataContext.SubmitChanges();
}
}

注释掉的行我也试过取消注释,但没有帮助。

如果我注释掉 foreach() 循环并添加一行 dbUser.UserName = "Cheese";它将很好地更新数据库中的用户名。这让我相信这是与 foreach() 循环如何更改导致失败的 dbUser 对象有关。

当我调试 dbUser 对象时,它似乎正确地获取了作为参数传递的 User 对象的所有更改。

我也看了一些乐观并发的资料,在数据类型为timestamp的表中加了一列,不过好像也没什么效果。

我到底做错了什么?

我怎样才能让它普遍地检测到发生了什么变化并将这些变化正确地保存到数据库中?

最佳答案

我的猜测是有一个外键关系,您正在尝试复制它最初未加载(由于延迟加载)在复制过程中,它正在尝试加载它,但 DataContext 已被释放。

我一直在研究类似的问题。我最终使用 AutoMapper 为我处理复制属性。我已将 AutoMapper 配置为忽略主键字段以及任何关系。像这样的东西:

public void Update(User user)
{
using (var db = new DataContext(...))
{
var userFromDb = db.Users.Where(x => x.Id == user.Id).Single();
AutoMapper.Mapper.Map(user, userFromDb);
db.SubmitChanges();
}
}

我的自动映射器配置是这样的

AutoMapper.Mapper.Create<User, User>().ForMember(dest => dest.Id, opt => opt.Ignore())
.ForMember(dest => dest.SomeRelation, opt => opt.Ignore());

您可以在这里找到 AutoMapper:http://automapper.codeplex.com/

关于database - Linq to Sql - 如何使用存储库模式更新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840295/

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