2012-06-01 2 views
0

Я пытаюсь написать некоторую логику бизнес-уровня для приложения asp.net для вставки или обновления объекта. Я получаю объект из бизнес-уровня, а затем передаю его обратно для сохранения в db. Контекст данных содержится в бизнес-слое, который, как мне кажется, вызывает исключение.Обновление объекта с использованием Linq to SQL

Исключения составляют «Прикрепление или добавление объекта, который не является новым, возможно, был загружен из другого DataContext. Это не поддерживается».

Уверен, что мне не хватает небольшой настройки, но я просто не уверен, что.

это код, который делает вставку и обновление ....

public static void Save(Order order) 
{ 
     using (TicketInformationDataContext db = new TicketInformationDataContext()) 
     {     
      if (order.OrderID <= 0) 
       db.Orders.InsertOnSubmit(order); 
      else 
      { 
       db.ObjectTrackingEnabled = true; 
       ITable table = db.GetTable(typeof(Order)); 
       table.Attach(order, true); 
       db.Orders.Attach(order, true); 
      } 
      db.SubmitChanges(); 
     } 
} 
+0

Похоже, вы прикрепляете объект Order дважды к тому же контексту, который я думаю ... – mservidio

+0

Попробуйте комментировать: ITable table = db.GetTable (typeof (Order)); стол.Атрибут (заказ, правда); – mservidio

+0

Я пробовал комментировать «ITable table = db.GetTable (typeof (Order));' и 'table.Attach (order, true);' и просто имеет 'db.Orders.Attach (order, true); 'Я также пробовал это по-другому с помощью' db.Orders.Attach (order, true); 'закомментировал, и я получаю то же исключение. – Kywillis

ответ

0

Я считаю, что ваша проблема в том, что вы создаете отдельные контексты для загрузки Order, а затем для его сохранения.

Вы должны проектировать свои хранилища для работы против контекста, который вы можете пройти во время строительства (или предпочтительно вводить через IoC). Таким образом, обе операции будут работать в одном контексте.

Помните, что объекты привязаны к их контексту, и попытка их смешивания вызовет всевозможные проблемы, особенно с ленивой инициализацией или связанными объектами.

См. Принятый отклик для this similar question, в котором обсуждается конструкция репозитория и шаблон дизайна рабочей единицы.

+0

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

+0

Я вижу ... ну в этом случае вам суждено столкнуться с неприятностями. Объекты не предназначены для использования таким образом, это не должно пересекать контексты, для чего у вас должны быть промежуточные DTO. Проблема также будет связана с субъектами. Одним из подходов может быть использование вашей сущности «как бы», это был DTO. Значение в новом контексте загружает заказ по идентификатору и обновляет/сопоставляет каждое свойство и перенастраивает все отношения (также из нового контекста). Другой подход может заключаться в том, чтобы попытаться сделать это через отражение: http://www.codeproject.com/Tips/57831/How-to-Attach-object-to-a-different-data-context –

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