2013-05-29 2 views
1

У меня есть много-много отношений для диска Google, где папка может иметь много родительских папок и файлов и папок внутри. Как я правильно вставляю в свой элемент db, где уже существует родительская папка, здесь я получаю ошибку повторяющегося значения. Im использует FE 6.0v.Как в linq для сущностей, многие для многих добавляют ссылку

 var gDoc = new GoogleDoc(); 
     /// 

     do some entity stuff 

     /// 

     foreach (ParentReference parent in input.Parents) 
     { 
      var gParent = new GoogleParent(); 
      /// 
      do some entity stuff 
      /// 
      gDoc.GoogleParents.Add(gParent); 

     } 

     using (Model2Container dBase = new Model2Container()) 
     { 
      dBase.GoogleDocs.Add(gDoc); 
      dBase.SaveChanges(); 
     } 

EDIT, добавил код

добавили это прежде alocating новый parrent двутавровых получить ошибку. AcceptChanges не может продолжаться, потому что ключевые значения объекта конфликтуют с другим объектом в ObjectStateManager. Перед вызовом AcceptChanges убедитесь, что значения ключа уникальны.

 GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id); 
     if (gParent != null) 
      gDoc.GoogleParents.Add(gParent); 

добавил это при сохранении им в БД

 dBase.GoogleDocs.Add(gDoc); 
     foreach (GoogleParent parent in gDoc.GoogleParents) 
     { 
      GoogleParent gparent = dBase.GoogleParents.SingleOrDefault(s => s.Id == parent.Id); 
      if (gparent != null) 
      dBase.Entry(gparent).State = System.Data.Entity.EntityState.Unchanged; 
    } 
    dBase.SaveChanges(); 

Тем не менее, получить дубликат ошибки

EDIT 2: это похоже на работу

 using (Model2Container dBase = new Model2Container()) 
     { 
     var gDoc = new GoogleDoc(); 
     /// 

     do some entity stuff 

     /// 

     foreach (ParentReference parent in input.Parents) 
     { 
       GoogleParent gParent = OAuthDBGoogleDrive.getParent(parent.Id); 
       if (gParent != null) 
       { 
        gDoc.GoogleParents.Add(gParent); 
        dBase.GoogleParents.Attach(gParent); 
       } 
       else 
       { 
        gParent = new GoogleParent(); 
        /// 
        do some entity stuff 
        /// 
        gDoc.GoogleParents.Add(gParent); 
       } 
     } 

     dBase.GoogleDocs.Add(gDoc); 
     dBase.SaveChanges(); 
     } 

ответ

0

Как правило, DbSet.Attach() объекты, которые уже существуют в базе данных, и DbSet.Add() объектов, которые делают не существует в базе данных. Обе эти функции присоединяют объекты к контексту в состоянии Unchanged или Added соответственно. Все объекты в графе объектов также добавляются в этом состоянии, если они еще не отслеживаются контекстом.

В результате вам может потребоваться изменить отслеживаемое состояние одного объекта, если оно отслеживается в некорректном состоянии. Это можно сделать следующим образом:

// eg give the entity the unchanged state 
context.Entry(myEntity).State == EntityState.Unchanged; 
+0

Я знаю это, но GoogleParents - это список и только добавляет. Attach i можно использовать только непосредственно в базе данных. Я не знаю, как установить прикрепление или неизмененный объект, который является частью объекта, потому что он хранится в списке. – sinofis

+0

@sinofis, вы добавляете новый документ, содержащий ссылку на существующий объект. Вы должны убедиться, что ваши существующие объекты отслеживаются контекстом в правильном состоянии, т.е. 'Unchanged'. –

+0

отредактировал мой ответ с вашим кодом, все еще получая дубликаты – sinofis

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