C# 使用Linq到SQL更新对象

C# 使用Linq到SQL更新对象,c#,asp.net,sql,linq,linq-to-sql,C#,Asp.net,Sql,Linq,Linq To Sql,我正在尝试为asp.net应用程序编写一些业务层逻辑,以插入或更新对象。我从业务层获取一个对象,然后将其传递回数据库保存。数据上下文包含在业务层中,我认为这是导致异常的原因 例外情况是“试图附加或添加一个非新实体,可能是从另一个DataContext加载的。这是不受支持的。” 我肯定我错过了一些小设置,但我只是不知道是什么 这是执行插入和更新的代码 public static void Save(Order order) { using (TicketInformationDat

我正在尝试为asp.net应用程序编写一些业务层逻辑,以插入或更新对象。我从业务层获取一个对象,然后将其传递回数据库保存。数据上下文包含在业务层中,我认为这是导致异常的原因

例外情况是“试图附加或添加一个非新实体,可能是从另一个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();
        }
}
公共静态作废保存(订单)
{
使用(TicketInformationDataContext db=new TicketInformationDataContext())
{                

如果(order.OrderID,我认为您的问题在于您正在创建用于加载订单的单独上下文,以及稍后用于保存订单的单独上下文

您应该设计您的存储库,使其能够在构建过程中传递上下文(或者最好通过IoC注入)。 这样,两个操作将在相同的上下文中工作

请记住,实体绑定到它们的上下文,尝试将它们混合会导致各种问题,特别是对于延迟初始化或关联实体


请参阅的已接受响应,其中讨论了存储库设计和工作单元设计模式。

看起来您将Order对象附加到了我认为相同的上下文中两次……请尝试注释:ITable table=db.GetTable(typeof(Order));table.Attach(Order,true);我试过注释出
ITable table=db.GetTable(typeof(Order));
table.Attach(Order,true);
并且只使用
db.Orders.Attach(Order,true);
我也试过另一种方法使用
db.Orders.Attach(Order,true);
注释掉了,我得到了同样的例外。您正在创建并传递给此方法的Order对象是使用其他地方实例化的不同上下文创建的吗?我知道这可能是标准方法,但出于什么原因,我正在使用的设计是我需要的方法来实现它(这是库是一个更大项目的一部分)。我明白了……在这种情况下,您注定会遇到麻烦。实体不应该以这种方式使用,这不应该跨上下文,因为您应该有中间DTO。问题还将是相关实体。一种方法可以是“像这样”使用您的实体这是一个DTO。这意味着,在新上下文中,按ID加载订单,更新/映射每个属性,并重新配置每个关系(也来自新上下文)。另一种方法可能是通过反射进行尝试,如: