Linq to sql 导致重复插入的Linq到SQL EntitySet记录

Linq to sql 导致重复插入的Linq到SQL EntitySet记录,linq-to-sql,Linq To Sql,在WPF应用程序中,我在多层应用程序中使用Linq to SQL 这是一个考古照片归档申请,因此每个挖掘都有相应的图片,因此是一对多的关系。这个关系是由我用来创建POCO的SQLMetal正确创建的 这就是我遇到的问题: 通过UnitOfWork模式保存新对象或更改对象的更改,方法如下: using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) { //if this is a new record

在WPF应用程序中,我在多层应用程序中使用Linq to SQL

这是一个考古照片归档申请,因此每个挖掘都有相应的图片,因此是一对多的关系。这个关系是由我用来创建POCO的SQLMetal正确创建的

这就是我遇到的问题:

通过UnitOfWork模式保存新对象或更改对象的更改,方法如下:

using (IUnitOfWork unitOfWork = UnitOfWork.Begin())
                {
         //if this is a new record
                    if (SelectedExcavation.excavation.ExcavationId == 0)
                    {
                        IsNewRecord = true;
                        excavService.Add(SelectedExcavation.excavation);
                    }

                    //send the actual changes to the dbms
                    unitOfWork.Commit();
               }
一切正常

巴特特

每当更新至少有一条对应图片记录的记录时:

1插入新的挖掘记录

2更新当前挖掘记录

3以前的图片记录将其Id更改为新创建的挖掘Id

引擎盖下发生了什么? LINQtoSQL不能处理这样简单的更新场景吗


提前感谢

在这个WPF应用程序中,我使用Unity注册IDataContext,它作为构造函数参数传递给IUnitOfWork

实际上,我使用的是多层体系结构,它应该始终为我提供一个单独的IUnitOfWork对象,从而为我提供一个单独的IDataContext,但我想假装这种行为,使IUnitOfWork始终是同一个实例,从而使我的应用程序中的IDataContext实例在任何地方都是相同的

这意味着,就datacontext而言,应用程序实际上使用的是一个经典的两层应用程序

。。。我使用Unity解析的实例实际上在我的应用程序中到处都是相同的,我使用了这些实例的GetHashCode来证实这一点

所以一切似乎都按预期进行

但正如我在上一篇文章中所述,每当一条记录有相应的EntitySet记录并被更新时,Datacontext会立即按照以下顺序执行:

1插入主记录,其中包含更改前记录中的原始值

2在步骤1中,详细记录的更新将其Id更改为新的主记录

3使用更改的新值更新主记录

步骤1和2不应该出现,而只有步骤3是正确的,并且应该是Datacontext中唯一出现的步骤

我在很多博客上读到,为了克服这种情况,你必须附加/分离并做一些黑魔法,但正如我所悲伤的:到处都只有一个相同的DataContext,所以记录总是附加到它,所以这种现象不应该出现!还是我遗漏了什么


感谢您的帮助

我对您的UnitOfWork模式作业有感觉,您如何处理多层Linq 2 Sql?是否附着对象并对其进行更新?或者再次查询数据库并使用从某处获得的实例更改值!事实上我什么都没做!附加只会产生错误!我确信Entityset导致了这种行为,但不知道如何处理!