Linq to sql 使用不同的数据上下文插入和删除具有Linq to SQL的对象

Linq to sql 使用不同的数据上下文插入和删除具有Linq to SQL的对象,linq-to-sql,exception,f#,datacontext,Linq To Sql,Exception,F#,Datacontext,在利用不同的数据上下文时,使用Linq to SQL在数据库中插入和删除对象时遇到问题。只要我使用相同的上下文插入和删除代码,代码就可以正常工作。但是,为每个函数使用相同的上下文不是一个选项,因为这将在代码用于web服务时引入并发问题 代码是用F#编写的,但不应该有任何区别 let CreateUser user = use context = new Rsvp(connectionString) context.Users.InsertOnSubmit(user) co

在利用不同的数据上下文时,使用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抛出一个exeception,如下所示:

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

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

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

我正在用以下方法从一个C#test项目中测试它

[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);
    }
难道不能从不同的上下文中删除/插入相同的对象吗

编辑:
一位朋友给我发来的邮件可能有助于解决问题,但它似乎不是问题的最终解决方案。

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

如果您想使用一些很好的函数思想,这可能是一个实现计算生成器以保持数据上下文的好地方(即状态monad)。然后你可以写:

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

其中
getCurrentContext
是一个返回正在传递的上下文的操作。可能有几个例子可以说明如何在F#中实现状态monad。请参阅。

我看到为DataContext实现状态monad是多么有用。然而,我仍然感到困惑,为什么我不能从一个上下文中删除插入到另一个上下文中的实体。这意味着我永远无法删除插入的实体。@kristian:我不是100%确定,但我认为您需要检索并使用相同的数据上下文实例删除实体。您不能使用一个上下文来加载它,而使用另一个上下文来删除它,因为该实体属于第一个对象。(而且不能被它不属于的上下文操纵)