2012-06-09 2 views
0

Я создаю веб-приложение для flick.Вставьте несколько дочерних записей с использованием linq в sql

У меня есть таблица flickrUser и таблица flickrPhoto

Я уже вставленная запись flickrUser и теперь я хочу, чтобы вставить некоторое flickrPhoto запись;

FlickrPhoto: 
-photoid 
-flickruserid 
-id (PK) 

вот как я пытаюсь вставить flickrphoto записи (flickrphoto хранится в таблице MyPhoto)

public void insertList(List<string> photoids, string flickruserid) 
    { 
     PicsPreciousLinqDataContext db = new PicsPreciousLinqDataContext(); 
     for (int i = 0; i < photoids.Count; i++) 
     {    
       MyPhoto mf = new MyPhoto(); 
       mf.photoId = photoids[i]; 
       mf.source = "flickr"; 

       var query = from b in db.FlickrUsers 
          where b.nsid == flickruserid 
          select b; 

       FlickrUser fUser = query.FirstOrDefault(); 
       mf.FlickrUserId = fUser.nsid; 
       db.MyPhotos.InsertOnSubmit(mf);     
     } 
     db.SubmitChanges(); <= Cannot add an entity with a key that is already in use. 
    } 

Я попробовал несколько вариаций на это, но и без успеха. Каков правильный способ вставки нескольких дочерних записей?

Любая помощь приветствуется.

+0

Какой столбец является основным ключом для MyPhoto? Ошибка просто говорит вам, что в базе данных уже есть строка с ключом, который вы пытаетесь добавить. – hatchet

+0

У меня есть другой столбец в MyPhoto, называемый идентификатором, который является PK и идентификатором уникального типа. – ThdK

+0

. В стороне вы смотрите FlickrUser на каждой итерации цикла, когда ничего об этом не меняется. Вы должны сделать это только * один раз * до цикла. – cjk

ответ

1

Если значение идентификатора устанавливается в базе данных (т.е. NEWID() в качестве значения по умолчанию, или автоприращение), то в вашем DBML дизайнер, нажмите на столбец, это первичный ключ и убедитесь, что следующие свойства имеют следующие значения:

Auto Generated Value: True 
Auto-Sync: OnInsert 
Primary Key: True 

Если он не установлен в базе данных, то вместо того, чтобы устанавливать первые два свойства выше, вы должны создать уникальные значения для Id в вашем коде C# для каждой строки, которую вы вставляете.

Это может быть сделано с:

Guid.NewGuid(); 

Так что в вашем коде:

PicsPreciousLinqDataContext db = new PicsPreciousLinqDataContext(); 
... 
MyPhoto mf = new MyPhoto(); 
      mf.photoId = photoids[i]; 
      mf.source = "flickr"; 
      mf.id = Guid.newGuid(); 
... 
db.MyPhotos.InsertOnSubmit(mf); 

для столбцов, столбцы типа UniqueIdentifier в базе данных.

+0

Хорошо, используя Guid.NewGuid() для атрибута id только что созданного MyPhoto. Как это можно установить в базе данных? Я не хочу называть guid.newGuid каждый раз, когда мне нужно вставить запись ... Я создал свои таблицы с помощью visual studio и задал тип поля уникальному идентификатору. Должен ли я сделать что-то еще? – ThdK

+0

Я знаю только, как установить его с помощью инструмента управления SQL Server.Но нет ничего плохого в настройке кода. – hatchet

+0

Я буду искать дополнительную информацию об уникальном идентификаторе в визуальной студии, но ваш ответ будет делать сейчас :) thx! – ThdK

2

Пожалуйста, проверьте ваш MyPhotos таблицы, я подозреваю, что он имеет USERID столбца в качестве первичного ключа. Это должен быть столбец с внешним ключом/ссылкой.

добавить следующий вместо кода,

for (int i = 0; i < photoids.Count; i++) 
    {    
      MyPhoto mf = new MyPhoto(); 
      mf.photoId = photoids[i]; 
      mf.source = "flickr"; 

      var query = from b in db.FlickrUsers 
         where b.nsid == flickruserid 
         select b; 

      FlickrUser fUser = query.FirstOrDefault(); 
      mf.FlickrUserId = fUser.nsid; 
      db.MyPhotos.Add(mf);    
    } 
db.SubmitChanges(); 
+0

Я обновил свой вопрос, показывая также поле идентификатора PK в таблице MyPhoto. userid - это внешний ключ. Можете ли вы мне помочь? – ThdK

+0

Пожалуйста, проверьте мой код. и попробуйте –

+0

Thx, для кода, но он дает мне ту же ошибку. – ThdK

Смежные вопросы