我在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?
答案 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。