Linq To SQL:防止创建重复项

时间:2014-09-01 10:39:53

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

考虑以下简单的用户表

enter image description here

我想编写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并且无需触及数据库即可实现的任何替代方案?

1 个答案:

答案 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