InsertAllOnSubmit仅插入第一条数据记录

5
今天我在尝试导入多个数据记录时,发现我的导入服务出现了奇怪的行为。
当我像这样操作时,所有的数据记录都被成功导入,并且自增值是正确的(见截图):
public void Create(List<Property> properties)
{
    foreach (Property prop in properties) {
        dbc.Property.InsertOnSubmit(prop);
        dbc.SubmitChanges();
    }
}

当我尝试这样做时,只有第一条数据记录获得了正确的自增值(请参见截图):
foreach (Property prop in properties) {
    dbc.Property.InsertOnSubmit(prop);
}
dbc.SubmitChanges();

我也一样:

dbc.Property.InsertAllOnSubmit(properties);
dbc.SubmitChanges();

有人知道为什么会这样吗?根据我的理解,这三种变体应该导入所有数据记录,但缺失的自增值表明并非如此。

[编辑]添加了两张截图。


只是顺便提一下,你确定是 dbc.Property 而不是 dbc.Properties 吗?LINQ to SQL 通常会将集合名称变成复数形式... - BFree
是的,它是"Property"。我自己命名了这些表,它们不是自动生成的或者类似的东西。而且,如果它被称为"Properties",那么第一个例子也不应该起作用,对吧? - Michael Klement
似乎大家都认为这是个问题,但没有人点赞?那我来点赞了。我觉得这可能是一个 bug。 - MattH
5个回答

6

我曾遇到同样的问题,结果发现是由于重写了映射类上的Equals方法所致。我的Equals方法仅比较主键字段,而这个主键字段是标识字段。当然,当对象是新的时候,所有标识都为0。因此,在调用InsertAllOnSubmit时,它认为所有新对象都是相同的,并且基本上忽略了除第一个之外的每一个对象。


2

不太确定为什么第二种变体不起作用,但是最后一种应该是:

dbc.Property.InsertallOnSubmit(properties);
dbc.SubmitChanges();

编辑

第二次循环尝试:

foreach (Property prop in properties) 
{   
    var newProp = new Property();
    newProp = prop;
    dbc.Property.InsertOnSubmit(newProp);
}
dbc.SubmitChanges();

对于最后的解决方案,请尝试:

dbc.Property.InsertAllOnSubmit(properties.ToList());
dbc.SubmitChanges();

没有错误。我已经在我的原始帖子中添加了两张截图。正如您所看到的,第一种方法会为所有属性添加ID(方括号[]内的数字)。在第二个截图中,只有第一个属性会得到ID。由于提供的代码是两个截图中唯一不同的东西,所以我绝对不知道问题出在哪里! - Michael Klement
也许就是这样了...我找不到其他的问题了。 - Michael Klement
尝试执行 "InsertAllOnSubmit(properties.ToList())"。 - James
两个变量仍然相同,只是第一个属性获得了一个ID。无论如何,感谢您继续提供帮助。 - Michael Klement
嗯,非常奇怪,我所能想到的唯一可能就是与LINQ代码有关的一个错误。我将尝试创建一个小的测试应用程序,并会尽快回复你。 - James

1

1
唉,我在家里无法复现这个 bug,而且 Linq 团队也无法复现,所以该票已经被关闭了。 :/ - Michael Klement

1

我几分钟前遇到了这个问题。

我的问题是,我发送到InsertAllOnSubmit<mappedClass>()的列表中充满了来自单个mappedClass实例的对象。我根据我想要添加到数据库的视图模型实例修改成员,然后重新将实例添加到列表中。

看起来像是新手错误,但如果有人仍然遇到这个问题,可以检查一下!


0

只需使用这个完美的解决方案。
因为我们有一个名为“TestTable”的新实体。
在for循环中初始化此实体,如下:

TestTable objTable = new TestTable ();

在for循环中,将实体项添加到List<TestTable>的列表对象中。
InsertAllOnSubmit()移动到for循环之外,现在它应该可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接