2

我在使用 LINQ 时遇到了一个有趣的问题。当我实例化一个实体时,在 DataContext 上调用 .SubmitChanges() 将在数据库中插入一个新行 - 而无需调用 .Insert[All]OnSubmit(...)。

//Code sample:
Data.NetServices _netServices = new Data.NetServices(_connString);

Data.ProductOption[] test = new Data.ProductOption[]
{
        new Data.ProductOption
        {
             Name="TEST1", 
             //Notice the assignment here
             ProductOptionCategory=_netServices.ProductOptionCategory.First(poc => poc.Name == "laminate")
        }
};

    _netServices.SubmitChanges();

运行上面的代码将在数据库中插入一个新行。我在编写应用程序来解析 XML 文件并填充一些表时注意到了这种效果。当我只期望大约 50 个左右时,我注意到有 1000 多个插入 - 然后我终于隔离了这种行为。

如何防止这些对象被隐式持久化?

谢谢,-查尔斯

4

1 回答 1

2

把这种关系想象成有两个方面。当您设置关系的一侧时,另一侧需要更新,因此在上述情况下以及设置 ProductOptionCategory 时,它实际上是将新对象添加到层压板 ProductOptionCategory 侧的 ProductOptions 关系中。

解决方法是您已经发现并改为设置基础外键,因此 LINQ to SQL 不会以通常的方式跟踪对象,并且需要隐式指示它应该保留对象。

当然,性能的最佳解决方案是从源数据中确定您不想添加哪些对象,并且从一开始就不要创建实例。

于 2008-12-23T08:40:58.707 回答