考虑以下简单的用户表
我想编写Linq To SQL Code,它通过某个谓词返回用户,例如电子邮件地址,或者如果用户尚不存在则创建用户。代码可能看起来像
User GetUser(String name, String email) {
using (var context = new DataContext()) {
User user = context.Users.FirstOrDefault(u => u.email.Equals(email));
if (user != null)
return user;
user = new User() { name = name, email = email };
context.Users.InsertOnSubmit(user);
context.SubmitChanges();
return user;
}
}
代码可能会并行执行,但不应创建重复的用户。
由于多种原因,我不希望为表创建唯一约束。您是否看到使用Linq To SQL并且无需触及数据库即可实现的任何替代方案?
答案 0 :(得分:2)
使用TransactionScope
(默认情况下可序列化隔离级别):
User GetUser(String name, String email)
{
using (var tran = new TransactionScope())
{
using (var context = new DataContext())
{
User user = context.Users.FirstOrDefault(u => u.email.Equals(email));
if (user != null)
return user;
user = new User() { name = name, email = email };
context.Users.InsertOnSubmit(user);
context.SubmitChanges();
tran.Complete();
return user;
}
}
}
有关LINQ to Sql中的事务支持的更多信息:http://msdn.microsoft.com/en-us/library/bb386995