Была предпринята попытка присоединить или добавить объект, который не является новым, возможно, был загружен из другого DataContext.Это не поддерживается - PullRequest
1 голос
/ 08 ноября 2011

Мой проект разделен на PresentationLayer, BusinesLogicLayer и DataAccessLayer. Каждый созданный объект проходит через эти слои. В упрощении:

SetFilter.xaml.cs

FilterFactory fFactory = new FilterFactory();
Filter myFilter = fFactory.Create(someClient, time, message);
FilterBLO filterBLO = new FilterBLO();
filterBLO.Save(myFilter);

FilterBLO.cs

FilterDAO filterDAO = new FilterDAO();
using (TransactionScope transcope = new TransactionScope())
{
    filterDAO.Save(myFilter);
    transcope.Complete()
}

FilterDAO.cs

using(DBDataContext dbdc = new DBDataContext)
{
    dbdc.Filter.InsertOnSubmit(myFilter);
    changeSet = dbdc.GetChangeSet();
    dbdc.SubmitChanges()
}

Фильтр связан с таблицей Client с использованием таблицы ClientFilter, содержащей FilterID и ClientID. (отношение многие ко многим)

Если я создаю новые 3 объекта, все в порядке, но если я получаю существующую Client в базе данных (также используя ClientBLO и ClientDAO, поэтому в отдельном TransactionScope и отдельном DBDataContext) я получаю ошибку:

Была предпринята попытка присоединить или добавить объект, который не является новым, возможно, был загружен из другого DataContext. Это не поддерживается.

(Я искал другие похожие темы, но не нашел решения своей проблемы.)

И наконец мой вопрос

Как сохранить myFilter, если в базе данных существует Client. Я попытался Attach() передать этот текст в FilterDAO.cs, но я получил ту же ошибку.

1 Ответ

3 голосов
/ 08 ноября 2011

Вы должны получить Client из базы данных с тем же DataContext, который вы используете для InsertOnSubmit Filter; затем вы должны установить значение Client в объекте Filter с этим объектом до InsertOnSubmit.

...