【问题标题】:Inserting and removing objects with Linq to SQL using different Data Contexts使用 Linq to SQL 使用不同的数据上下文插入和删除对象
【发布时间】:2011-03-12 18:05:45
【问题描述】:

在使用不同的数据上下文时,我在使用 Linq to SQL 在数据库中插入和删除对象时遇到问题。只要我使用相同的上下文插入和删除,代码就可以正常工作。但是,不能为每个函数使用相同的上下文,因为这会引入并发问题,因为代码用于 Web 服务。

代码是用 F# 编写的,但应该没有任何区别。

let CreateUser user =
    use context = new Rsvp(connectionString)
    context.Users.InsertOnSubmit(user)
    context.SubmitChanges()


let RemoveUserById user_id =
    use context = new Rsvp(connectionString)
    let user = GetUser user_id
    context.Users.DeleteOnSubmit(user)
    context.SubmitChanges()

DeleteOnSubmit 抛出异常如下:

System.InvalidOperationException:无法删除尚未附加的实体。

现在您会认为您可以将对象附加到新的数据上下文中。但是这样做会导致另一个异常:

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

我正在使用以下方法从 C# 测试项目中对此进行测试

[TestMethod]
    public void Can_create_and_remove_a_new_user()
    {
        User user = new User();
        user.Name = "Test User";
        user.Email = "test@mail.com";
        user.Role_id = 1;

        UserModule.CreateUser(user);

        User inserted_user = UserModule.GetUserByEmail("test@mail.com");
        Assert.IsNotNull(inserted_user);

        UserModule.RemoveUserById(inserted_user.Id);
    }

难道不能从不同的上下文中删除/插入同一个对象吗?

编辑: 有朋友发给我this article,这可能有助于解决问题,但似乎不是问题的最终解决方案。

【问题讨论】:

    标签: linq-to-sql exception f# datacontext


    【解决方案1】:

    我认为这就是DataContext 的工作原理。一个实体只能属于一个数据上下文,当您需要使用它一段时间时,您应该保留用于检索实体的数据上下文。

    如果您想尝试一些不错的函数式想法,这可能是实现计算构建器以保留数据上下文(即状态单子)的好地方。然后你可以写:

    let CreateUser user = datacontext {
      let! context = getCurrentContext()
      context.Users.InsertOnSubmit(user)     
      context.SubmitChanges()  }
    

    getCurrentContext 是一个返回您正在传递的上下文的操作。可能有一些示例如何在 F# 中实现 state monad。见for example this article

    【讨论】:

    • 我知道为 DataContext 实现一个状态单子是如何有用的。但是,我仍然对为什么我不能从另一个上下文中删除插入到一个上下文中的实体感到困惑。这意味着我永远无法删除插入的实体。
    • @kristian:我不是 100% 确定,但我认为您需要使用相同的数据上下文实例检索并删除实体。您不能使用一个上下文来加载它而另一个上下文来删除它,因为实体 属于 属于第一个对象。 (而且根本无法被它不属于的上下文所操纵)
    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多