C# 在ADO.NET实体框架中使用静态数据访问方法

C# 在ADO.NET实体框架中使用静态数据访问方法,c#,ado.net,linq-to-entities,thread-safety,C#,Ado.net,Linq To Entities,Thread Safety,您好,我是第一次使用ADO.NET实体框架,静态代码分析建议我将以下方法更改为静态方法,如下所示 我的问题很简单,这个线程安全吗 public static void InsertUserDetails(UserAccount userAccount) { using (KnowledgeShareEntities entities = new KnowledgeShareEntities()) {

您好,我是第一次使用ADO.NET实体框架,静态代码分析建议我将以下方法更改为静态方法,如下所示

我的问题很简单,这个线程安全吗

public static void InsertUserDetails(UserAccount userAccount)
        {
            using (KnowledgeShareEntities entities = new KnowledgeShareEntities())
            {
                Users user = new Users();
                user.usr_firstname = userAccount.FirstName;
                user.usr_surname = userAccount.LastName;
                user.usr_email = userAccount.Contact.Email;
                user.usr_logon_name = userAccount.SAMUserAccountName.ToUpper();
                user.usr_last_login_datetime = DateTime.Now;
                entities.AddToUsers(user);
                entities.SaveChanges();
            }
        }

由于只使用局部变量,因此该方法是线程安全的。没有涉及静态变量,因此所有内容都将在线程本地堆栈上,不会出现争用情况。

由于您仅使用本地变量,因此该方法是线程安全的。没有涉及静态变量,因此所有内容都将在线程本地堆栈上,不会发生争用情况。

我同意它是线程安全的,因为它只使用本地变量,但这可能是静态代码分析建议它应该是静态方法的唯一原因,因为静态数据访问通常不是一个好主意。任何使用此静态方法插入用户的代码都有一个在单元测试期间很难模拟的静态依赖项,这意味着调用此静态方法的单元测试代码意味着测试必须针对真实数据库。也许原始海报将标题改为询问线程安全性。@FlipPerfect您绝对正确地指出静态方法很难测试,不应在本例中使用,但这有点离题,因为OP刚刚询问了线程安全性。我同意它是线程安全的,因为它只使用局部变量,但这可能是静态代码分析建议它应该是静态方法的唯一原因,因为静态数据访问通常不是一个好主意。任何使用此静态方法插入用户的代码都有一个在单元测试期间很难模拟的静态依赖项,这意味着调用此静态方法的单元测试代码意味着测试必须针对真实数据库。也许最初的海报将标题改为询问线程安全性。@FlipPerfect您绝对正确地指出静态方法很难测试,不应该在本例中使用,但这有点离题,因为OP刚刚询问了线程安全性。