Вставка реляционных данных с помощью Linq to SQL приводит к ошибке повторяющегося ввода - PullRequest
0 голосов
/ 22 февраля 2012

Я разработал проект базы данных в редакторе диаграмм базы данных Visual Studio и создал все свои таблицы из этого. Я также создал класс Linq to SQL и добавил свои таблицы для создания объектов для каждой таблицы. Я столкнулся с проблемой при попытке вставить новые записи в базу данных.

Например:

Допустим, у меня есть две таблицы: исполнители и альбомы. Один исполнитель может иметь несколько альбомов (один ко многим). Альбом имеет поле ArtistID, которое является FK для PK ArtistID в таблице Artist. Их идентификаторы - это 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?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

Очевидно, вы установили свойство Artist Альбома для объекта, который был извлечен с другим экземпляром datacontext.Следовательно, ваш новый DatabaseDataContext «думает», что Artist должен быть вставлен.

Вы можете либо установить Album.ArtistId (не объект Artist), либо загрузить Artist в том же контексте данных и добавить альбом вего коллекция альбомов.

Кстати, using (var context = new DatabaseDataContext()) { ... } лучше.

0 голосов
/ 06 августа 2012

Сначала необходимо решить дублирующийся первичный ключ, и в ходе моего теста я создал свою первичную таблицу с первичным ключом UNIQUEIDENTIFIER и значением по умолчанию (newid()).

Затем, когда вы перетаскиваететаблица в ваш проект класса Linq To SQL, класс таблицы создается со всем, что вы хотели, кроме: столбцу первичного ключа должно быть присвоено значение Auto Generate Values, равное true, но это не так!По умолчанию установлено значение false, если тип данных столбца имеет тип UNIQUEIDENTIFIER.Затем я отбросил столбец в MS SQL и заново создал его с типом данных INT, перетащил его в класс Linq to SQL, а затем установил для свойства столбца Auto Generate Values значение true.

Так что если вы используетеUNIQUEIDENTIFIER, вам нужно вручную установить для свойства Auto Generate Values значение true.

0 голосов
/ 22 февраля 2012

Я думаю, что дубликат первичного ключа может быть GUID.Empty.Если мое понимание правильное.

Я думаю, что решения этой проблемы.

установить значение по умолчанию для столбца pk_artist равным newid().Это позволяет автоматически генерировать основной Kerr.

Или

Явное назначение первичного ключа сущности.

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

Надеюсь, что эта помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...