【问题标题】:Can't delete record via the datacontext it was retrieved from无法通过从中检索到的数据上下文删除记录
【发布时间】:2013-04-14 02:18:13
【问题描述】:

我刚刚升级了我的应用程序的一种方法以使用已编译的查询(不确定这是否相关)。现在,当我运行代码时,我收到了相互矛盾的错误消息。

这是我的方法:

MyClass existing = Queries.MyStaticCompiledQuery(MyRequestScopedDataContext, param1, param2).SingleOrDefault();

if (existing != null)
{
    MyRequestScopedDataContext.MyClasses.DeleteOnSubmit(existing);
}

当我运行它时,我会收到以下消息:

无法删除没有 已附上。

请注意,编译后的查询和 DeleteOnSubmit 引用相同的 DataContext。我仍然认为我会幽默地应用程序并在 DeleteOnSubmit 之前添加一个附加命令,如下所示:

MyClass existing = Queries.MyStaticCompiledQuery(MyRequestScopedDataContext, param1, param2).SingleOrDefault();

if (existing != null)
{
    MyRequestScopedDataContext.MyClasses.Attach(existing);
    MyRequestScopedDataContext.MyClasses.DeleteOnSubmit(existing);
}

但是...当我运行这段代码时,我得到一个完全不同的矛盾错误信息:

已尝试附加或 添加一个不是新的实体,也许 从另一个加载 数据上下文。这不受支持。

我完全不知所措......

有其他人知道为什么我不能通过我从中检索到的同一 DataContext 删除记录吗?

【问题讨论】:

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


    【解决方案1】:

    好吧,静态数据上下文已经听起来像是一个潜在的问题(特别是线程,还有陈旧的对象和处置)。我的直接想法是:是否启用了对象跟踪?不确定是否需要,但肯定需要考虑。

    【讨论】:

    • 这是一个 asp.net 应用程序,我使用静态引用,因此每个请求只创建一个 DataContext 实例。我进行了调试以确保在这种情况下这是真的,而且似乎是这样。
    • 没有; “静态”!=“每个请求”。 static = "每个电话都共享这个"。在 ASP.NET 中对静态非常谨慎。您可能不会注意到开发机器上的痛苦,但在服务器上?它至少可以扩展到 1 个用户。
    • 它不仅仅是静态的,它由一个专门的类提供服务,确保每个请求只创建一个上下文。我已经彻底测试,以确保 DataContext 只为每个请求初始化一次,尤其是这个工作单元。
    • DataContext 实际存储在 HttpContext.Items 字典中。所以我想这不是真正的静态,对不起,如果那是一只红色的野兔。我更改了示例代码以更准确地反映这一点
    • 啊,好的;我认为假设最坏的情况更好(最安全);-p
    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2020-03-04
    • 2018-08-26
    • 2019-09-25
    相关资源
    最近更新 更多