在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不能处理这种简单的更新方案吗?
提前致谢
答案 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,所以记录总是附加到它,所以这种现象不应该出现! (或者我错过了什么)!???
感谢任何帮助!