使用Linq到SQL插入关系数据会导致重复输入错误

时间:2012-02-22 14:45:24

标签: c# sql linq

我在Visual Studio数据库图编辑器中编写了一个数据库设计,并从中创建了所有表。我还创建了一个Linq to SQL类,并添加了我的表来为每个表创建对象。尝试将新条目插入数据库时​​,我遇到了一个问题。

例如:

假设我有两张桌子,艺术家和专辑。单个艺术家可以拥有多个专辑(一对多)。相册具有ArtistID字段,该字段是Artist表中ArtistID PK的FK。它们的ID是由数据库自动生成的GUID。

现在,在我的代码中,我创建了一个新的Album对象(称为myAlbum),并将其Artist对象设置为已存在于数据库中的Artist(myArtist)。

如果我这样做:

DatabaseDataContext context = new DatabaseDataContext();
context.Albums.InsertOnSubmit(myAlbum);
context.SubmitChanges();

我最终得到一个SqlException:“违反PRIMARY KEY约束'PK_Artist'。无法在对象'dbo.Artist'中插入重复键。 声明已经终止。“

如果我将myAlbum.Artist与已经存在于数据库中的Artist进行比较,Linq说它们是相同的,所以它知道它们是同一个对象。

如何让Linq插入新的Album对象并将其链接到数据库中的现有Artist,而不尝试再次插入Artist?

3 个答案:

答案 0 :(得分:0)

我认为重复的主键可能是GUID.Empty。如果我的理解是正确的。

我会考虑解决这个问题。

pk_artist列的默认值设置为newid()。这允许主Kerr自动生成。

明确地将主键分配给实体。

myAlbum.Pk_Artist = GUID.NewGiud();
context.Albums.InsertOnSubmit(myAlbum);

希望这个帮助

答案 1 :(得分:0)

显然,您将Album的Artist属性设置为使用其他datacontext实例获取的对象。因此,您的新DatabaseDataContext“认为必须插入艺术家。

您可以设置Album.ArtistId(不是Artist对象),也可以在同一数据上下文中获取Artist,并将相册添加到其Albums集合中。

顺便说一句,using (var context = new DatabaseDataContext()) { ... }更好。

答案 2 :(得分:0)

您需要首先解决重复的主键,并且在我的测试中,我使用主键UNIQUEIDENTIFIER创建了我的主表,默认值为(newid())

然后,当您将表拖到Linq To SQL类项目中时,将使用您想要的所有内容创建表类,除了:主键列应将其Auto Generate Values设置为true,但不是!当列数据类型为UNIQUEIDENTIFIER类型时,默认为false。 然后我将该列放在MS SQL中并使用数据类型INT重新创建它,将其拖入Linq to SQL类,然后将列属性Auto Generate Values设置为true。

因此,如果您使用UNIQUEIDENTIFIER,则需要手动将Auto Generate Values属性设置为true。