Linq to sql 通过覆盖已删除对象的数据库值(LINQ到SQL)解决并发冲突
我想实现一个通用的冲突处理程序 在这个过程中,我遇到了由于试图更改已删除对象而发生冲突的情况 一般来说,我希望用户选择是坚持自己的更改,还是取消更改。这就是为什么我的处理程序要求用户提供反馈 因此,如果/当我遇到已删除的实体时,如果用户选择重新插入该实体,我希望能够重新插入该实体 我已经尝试使用Linq to sql 通过覆盖已删除对象的数据库值(LINQ到SQL)解决并发冲突,linq-to-sql,conflict,Linq To Sql,Conflict,我想实现一个通用的冲突处理程序 在这个过程中,我遇到了由于试图更改已删除对象而发生冲突的情况 一般来说,我希望用户选择是坚持自己的更改,还是取消更改。这就是为什么我的处理程序要求用户提供反馈 因此,如果/当我遇到已删除的实体时,如果用户选择重新插入该实体,我希望能够重新插入该实体 我已经尝试使用ObjectChangeConflict的元表数据来插入数据表中的对象,但是,尽管该实体不再在表中(不再出现在数据上下文中),我得到一个异常,即我无法添加一个已经存在的实体 我的代码如下: GmngrDa
ObjectChangeConflict
的元表
数据来插入数据表中的对象
,但是,尽管该实体不再在表中(不再出现在数据上下文中),我得到一个异常,即我无法添加一个已经存在的实体
我的代码如下:
GmngrDatabaseContextDataContext formDbContext;
RefreshMode UserSelectedConfilctResolutionSceme;
我还可以如何执行此任务?
提前感谢。首先,您会得到异常,因为实体确实已经在数据上下文中(否则冲突不会从一开始就引发)
我可以想出两种选择:
如果不需要主键与已删除实体的键相同(例如,如果该键只是一个标识),则可以创建一个新实体,将冲突实体的值复制到此新实体并插入它,而不是插入失败的实体
如果主键很重要,并且您坚持要插入您手中的实体,我建议使用不同的datacontext,它不“知道”这个实体,并使用这个上下文插入它
希望有帮助
科比
// resolve all conflicts according to the desires of the user
foreach (ObjectChangeConflict occ in formDbContext.ChangeConflicts)
{
occ.Resolve(UserSelectedConfilctResolutionSceme, true);
// Conflicted due to deleted object?
if (occ.IsDeleted && UserSelectedConfilctResolutionSceme == RefreshMode.KeepCurrentValues)
{
try
{
MetaTable metatable = formDbContext.Mapping.GetTable( occ.Object.GetType() );
formDbContext.GetTable( metatable.RowType.Type ).InsertOnSubmit( occ.Object );
}
catch (Exception ex)
{
string err = ex.Message;
}
}
}
formDbContext.SubmitChanges(ConflictMode.FailOnFirstConflict);