Linq to sql 使用不同的数据上下文插入和删除具有Linq to SQL的对象
在利用不同的数据上下文时,使用Linq to SQL在数据库中插入和删除对象时遇到问题。只要我使用相同的上下文插入和删除代码,代码就可以正常工作。但是,为每个函数使用相同的上下文不是一个选项,因为这将在代码用于web服务时引入并发问题 代码是用F#编写的,但不应该有任何区别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
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%确定,但我认为您需要检索并使用相同的数据上下文实例删除实体。您不能使用一个上下文来加载它,而使用另一个上下文来删除它,因为该实体属于第一个对象。(而且不能被它不属于的上下文操纵)