简体   繁体   English

Linq To SQL:防止创建重复项

[英]Linq To SQL: Prevent creation of duplicates

Consider the following simple User table 考虑下面的简单用户表

在此处输入图片说明

I want to write Linq To SQL Code that returns a user by some predicate, eg the email address, or creates the user if he does not yet exists. 我想编写Linq To SQL代码,该代码通过某些谓词(例如电子邮件地址)返回用户,或者如果该用户尚不存在,则创建该用户。 The code might look like 该代码可能看起来像

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;
    }
}

The code might get executed in parallel, but should not create duplicate users. 该代码可能会并行执行,但不应创建重复的用户。

I would prefer to not create a unique constraint for the table for several reasons. 由于某些原因,我不想为该表创建唯一约束。 Do you see any alternative that could be realized using Linq To SQL and without touching the database? 您是否看到可以使用Linq To SQL而不接触数据库的任何替代方法?

Use TransactionScope (Serializable isolation level is by default): 使用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;
        }
    }
}

More info on Transactions support in LINQ to Sql: http://msdn.microsoft.com/en-us/library/bb386995 有关LINQ to Sql中的事务支持的更多信息: http : //msdn.microsoft.com/zh-cn/library/bb386995

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM