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

时间:2009-12-18 10:11:53

标签: linq-to-sql

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

(这是一个考古文件照片申请),所以每次挖掘都有相应的图片,因此是一对多的关系。这种关系是由SQLMetal(我用来创建POCO)正确创建的。

所以这就是我遇到麻烦的情况:

保存更改(新对象或更改对象)是通过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();
               }

一切正常!

BUTTTT !!!

每当记录得到更新时(已经至少有一个)相应的图片记录:

1)插入新的挖掘记录

2)当前的挖掘记录得到更新

3)之前的图片记录将其ID更改为新创建的ExcavationId

引擎盖下发生了什么? Linq to SQL不能处理这种简单的更新方案吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

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

我实际上正在使用多层架构(它应该总是给我一个单独的IUnitOfWork对象,因此另外一个IDataContext),但是我想伪造这种行为以使IUnitOfWork始终是相同的实例(因此IDataContext实例在我的应用程序中无处不在)。

这意味着应用程序实际上使用了关于datacontext的(经典)两层应用程序!

...我解决的实例(使用Unity)在我的应用程序中实际上是相同的(我使用了GetHashCode()来确认这一点。)

所以一切似乎都按预期工作了!

但正如我在上一篇文章中所述,每当记录具有相应的EntitySet记录并得到更新时,Datacontext会立即执行(按此顺序):

1)主记录的插入,其中包含最初在更改前记录中的值

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

3)使用更改的(新)值更新主记录。

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

我在很多博客中都看到你必须要附加/分离并做一些黑魔法来克服这种情况,但是我很伤心:到处都只有一个和同一个DataContext,所以记录总是附加到它,所以这种现象不应该出现! (或者我错过了什么)!???

感谢任何帮助!