C# 已尝试附加或添加非新实体,可能是从另一个DataContext加载的。这是不受支持的

C# 已尝试附加或添加非新实体,可能是从另一个DataContext加载的。这是不受支持的,c#,linq-to-sql,insert,submitchanges,C#,Linq To Sql,Insert,Submitchanges,我的项目分为表示层、业务逻辑层和数据访问层。每个创建的对象都经过这些层。 在简化方面: SetFilter.xaml.cs FilterFactory fFactory = new FilterFactory(); Filter myFilter = fFactory.Create(someClient, time, message); FilterBLO filterBLO = new FilterBLO(); filterBLO.Save(myFilter); FilterBLO.cs F

我的项目分为表示层、业务逻辑层和数据访问层。每个创建的对象都经过这些层。 在简化方面:

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()
}
过滤道

using(DBDataContext dbdc = new DBDataContext)
{
    dbdc.Filter.InsertOnSubmit(myFilter);
    changeSet = dbdc.GetChangeSet();
    dbdc.SubmitChanges()
}
筛选器使用包含
FilterID
ClientID
ClientFilter
表连接到表
Client
。(多对多关系)

如果我创建了新的3个对象,一切都正常,但是如果我在数据库中获取现有的
客户端
(也使用
ClientBLO
ClientDAO
,那么在单独的
TransactionScope
和单独的
DBDataContext
)中,我会得到错误:

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

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

最后是我的问题


如果数据库中存在
Client
,我应该如何保存
myFilter
。我尝试了
Attach()
FilterDAO.cs
中将其连接到datacontext,但我得到了相同的错误。

您必须从数据库中获取客户端,该数据库与插入筛选器时使用的datacontext相同;然后,在InsertOnSubmit之前,必须使用该对象在筛选器对象中设置客户端值

myFilter
是在哪里/如何创建的?@ChrisF我添加了这个部分。在xaml.cs(presentationLayer)中,使用FilterFactory()时,
FilterFactory
do做什么?@ChrisF只需返回新的过滤器(someClient、time、message);我知道这是因为另一个DataContext,但我不知道如何在我的结构中使用它。也许除了全局DataContext之外还有其他解决方案(因为我认为这样的划分是更好的解决方案,不是吗?)它应该在非事务性场景中使用。将DataContext传递给DAL,并在传递的数据为null时封装一个新的数据,这是什么意思?您是否建议将DataContext从ClientDAL返回到PresentationLayer并再次传递给FilterDAL?这是一种解决方案,但我不确定如何从sql的角度验证这种操作的正确性,林琦认为您最好依靠从工厂获取DataContext;在PresentationLayer(事务逻辑开始和结束的地方)中获取它,并将其传递给所有xxDAO类。然后,所有xxxDAO类都应该接受DataContext参数,如果为null,则调用表示层中使用的同一工厂。