Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 通过覆盖已删除对象的数据库值(LINQ到SQL)解决并发冲突_Linq To Sql_Conflict - Fatal编程技术网

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);