【问题标题】:Updating an Object Using Linq to SQL使用 Linq to SQL 更新对象
【发布时间】:2012-06-01 03:12:31
【问题描述】:

我正在尝试为 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();
        }
}

【问题讨论】:

  • 看起来您将 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 对象是使用您在其他地方实例化的不同上下文创建的吗?

标签: c# asp.net sql linq linq-to-sql


【解决方案1】:

我相信您的问题是您正在创建单独的上下文来加载订单并稍后保存它。

您应该设计您的存储库以针对您可以在构建期间传递的上下文工作(或者最好通过 IoC 注入)。 这样,这两个操作将针对相同的上下文工作。

请记住,实体被绑定到它们的上下文中,尝试混合它们会导致各种问题,尤其是延迟初始化或关联实体。

请参阅this similar question 的已接受回复,其中讨论了存储库设计和工作单元设计模式。

【讨论】:

  • 我知道这可能是标准方法,但无论出于何种原因,我使用的设计都是我需要让它工作的方式(这是一个更大的项目的一部分)。
  • 我明白了……好吧,那样的话你注定会遇到麻烦。实体不应该以这种方式使用,这不应该跨越上下文,因为你应该有中间 DTO。问题也将是相关实体。一种方法可能是使用您的实体“好像”它是一个 DTO。这意味着,在新上下文中,按 ID 加载顺序,更新/映射每个属性,并重新配置每个关系(也来自新上下文)。另一种方法可能是通过反射尝试它:codeproject.com/Tips/57831/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多