在datacontext中插入的值在datacontext中不可用,直到submitchanges之后?

时间:2009-03-18 14:46:44

标签: vb.net linq linq-to-sql datacontext submitchanges

我正在浏览文章的XML文件和编写它们的记者。当我们将文章添加到_Data我们的datacontext时,我们可能会遇到需要添加的记者,所以我们这样做:

newJourno = New journalist With {.name = strJournalist}
_Data.journalists.InsertOnSubmit(newJourno)
.articles_journalists.Add(New articles_journalist With {.id_journalist = newJourno.id,         .id_article = .id})

然而,随后我们可能再次遇到同一位记者,当我们这样做时,没有任何回复:

Dim journo = _Data.journalists.Where(Function(s) s.name = strJournalist).SingleOrDefault

所以它再次使用上面的代码再次插入同一个记者。

完成所有插入操作后,我们执行submitchanges。此时它有一个头部适合:

INSERT语句与COLUMN FOREIGN KEY约束'FK_articles_journalists_journalists'冲突。冲突发生在数据库'blah',表'记者',列'id'。声明已经终止。

通过查看sql profiler中生成的sql,你可以看到它试图多次添加一些记者,这将失败,因为名称必须是不同的。由于记者没有更新,因此试图与这些记者一起插入的后续记录失败。

当然,如果我有一些记者的集合,添加一些,然后查看我的收藏,我应该看到所有这些,而不仅仅是原始的。我可以通过做一个提交更改来捏造它,但这看起来有点傻。

提前致谢,

戴夫。

3 个答案:

答案 0 :(得分:2)

如果要向数据库添加两个子父行,则必须分配实体而不是Id列,Id将自动生成,并且仅在提交更改后才可用。

你必须做一个articles_journalist对象,然后将newJourno实体分配给它:

articles_journalist.journalist = newJourno;

答案 1 :(得分:0)

CMS对于需要分配对象而不是id是正确的。

然而,这似乎没有解决datacontext没有意识到它已经添加了新内容直到你提交更改的问题。我只能假设这是设计的,因此我现在在代码插入我们稍后搜索的对象时调用submitchanges。

答案 2 :(得分:0)

“名称必须与众不同。”

这是一个严重的设计缺陷。人名永远不是唯一的。