2012-02-28 1 views
1

Эта проблема аналогична моему ранее заданному вопросу. Когда я запрашиваю данные с использованием Entity Framework (EF), я всегда использую параметр MergeOption.NoTracking, потому что в конечном итоге беру свои EF сгенерированные объекты и сопоставляю их, чтобы просматривать модели, которые имеют прекрасные атрибуты, украшенные в свойстве, для обеспечения проверки и т. Д.Добавление отношения внешнего ключа с Entity Framework

Я пытаюсь добавить внешний ключ с помощью EF, но в любое время я я получаю следующее исключение:

The object being attached to the source object is not attached to the same ObjectContext as the source object

Вот мой код:

public static void UpdateDownloadFileVersion(DownloadFile downloadFile, int[] selectedVersions) { 
     using (SupportEntity supportContext = new SupportEntity()) { 
      supportContext.DownloadFiles.Attach(downloadFile); 

      var productVersionIdsToAdd = (from v in selectedVersions 
              where (downloadFile.ProductVersions.Any(pv => pv.Id == v) == false) 
              select v).ToList(); 

      foreach (var productVersionId in productVersionIdsToAdd) { 
       var productVersion = new ProductVersion() { Id = productVersionId }; 
       downloadFile.ProductVersions.Attach(productVersion); //Exception happens here. 
       downloadFile.ProductVersions.Add(productVersion); 
      } 

      supportContext.SaveChanges(); 
     } 
    } 
+0

Попробуйте что-то вроде этого: var productVersion = new ProductVersion() {Id = productVersionId}; supportContext.ProductVersions.AttachTo («ProductVersions», productVersion); –

+0

@DmitrySavy - Я думаю, вы имели в виду 'supportContext.AttachTo (« ProductVersions », productVersion)'. Но, да, это трюк, хотя я действительно не понимаю, почему. Как «AttachTo» отличается от «ProductVersions.Attach»? Мне также не нравится это решение, потому что код не сильно набрал сейчас, и изменение может остаться незамеченным за пределами компиляции. –

ответ

2

Это где объекты-заглушки становятся очень полезными ...

var productVersion = new ProductVersion() { Id = productVersionId }; 
supportContext.AttachTo("ProductVersions", productVersion); 

Вот хороший article

В описанном выше случае, когда приложено productVersion присваивается product versions 'объект, PRODUCTVERSION объект привязывается к контексту, с EntityState=Added. Весь граф будет в или из контекста.

+0

Точно так оно и есть, не пробуйте что-то еще, оно сломается, а вы в какой-то момент сломаете шею! – ntziolis

+0

@ntziolis - Я уже использую объекты-заглушки (см. Мой код), но это не сработало (я получал исключение). –

+0

@Dmitry Savy - Я использовал объекты-заглушки, но я все еще получал исключение. Почему мне нужно называть 'AttachTo' строкой или просто« ProductVersions.Attach »? –

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

  • Нет связанных вопросов^_^