尝试附加或添加一个不是新的实体,可能是从另一个DataContext加载的.这是不支持的

本文关键字:实体 另一个 不支持 加载 DataContext 添加 一个 | 更新日期: 2023-09-27 18:13:43

我的项目分为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()
}

Filter通过包含FilterIDClientIDClientFilter表与表Client连接。(多对多关系)

如果我创建新的3个对象一切正常,但如果我得到现有的Client在数据库(也使用ClientBLOClientDAO,所以在单独的TransactionScope和单独的DBDataContext),我得到错误:

试图附加或添加一个不是新的实体,可能是从另一个DataContext加载的。这不是支持。

(我搜索了其他类似的线程,但我没有找到解决我的问题的方法)

最后是我的问题

如果Client存在于数据库中,我应该如何保存myFilter。我尝试Attach()它的数据上下文在FilterDAO.cs,但我得到同样的错误。

尝试附加或添加一个不是新的实体,可能是从另一个DataContext加载的.这是不支持的

你必须从数据库中获得客户端与你使用InsertOnSubmit过滤器相同的DataContext;那么你必须在InsertOnSubmit之前使用该对象在Filter对象中设置Client值。