LINQ到SQL存储库模式自动增量问题

本文关键字:问题 模式 SQL 存储 LINQ | 更新日期: 2023-09-27 17:54:45

我有奇怪的问题,我正试图弄清楚它是否是我的代码或某些东西已经与数据库搞砸了。我有一个表WebClienteLogin,它有一个属性Id(主键,自动增量)。当用户在网站上注册时,我正在插入新记录。

昨天早上,最后一个注册用户的Id值达到了9000左右,下午它开始以一种有趣的方式跳跃,所以下一个用户的Id是1200,25000 .....达到了29万。然而,今天它继续正常(增加1)。从统计数据来看,当有大量用户同时注册时,这种情况就会发生。

使用的技术:SQL Server 2008 R2,ASP。.NET MVC2, .NET 3.5

我正在使用LINQ的存储库模式。这是我对其中一个存储库的实现。

public SQLWebClientLoginRepository(string connectionString)
{
                dataContext = new DataContext(connectionString);
                tabla = dataContext.GetTable<WebClientLogin>(); 
}

public bool Save(WebClientLogin user)
            {
                bool success = true;            
                try
                {
                    if (user.Id == 0)
                    {
                        tabla.InsertOnSubmit(user);
                    }
                    else if (tabla.GetOriginalEntityState(user) == null)
                    {
                        tabla.Attach(user);
                        tabla.Context.Refresh(RefreshMode.KeepCurrentValues, user);
                    }
                    tabla.Context.SubmitChanges();  
                }
                catch
                {
                    ......
                }
                return success;
     }

用户还附加了其他对象,因此它对两个表执行INSERT操作,LINQ将其包装到事务中。

  var user = new WebClientLogin();
  // assigning other properties
  user.WebClient = new WebClient { // setting propeties }
  webClientLoginRepository.Save(user)

In log I get exception:

试图删除WebClientLogin和WebCLient之间的关系但是,关系的外键之一(WebClient.WebCLientLogin_id)不能设置为null." exception

我不知道它为什么这样做!有人有过类似的经历吗?

LINQ到SQL存储库模式自动增量问题

数据库启动状态:

WebClientLogin
ID = 900
WebClient
ID = 1, WebClientLogin_Id = 900

修改前的内存:

WebClientLogin
ID = 900
WebClient
ID = 1, WebClientLogin_Id = 900, WebClientLogin = that instance with 900

检查WebClientLogin的WebClient属性。在SubmitChanges时的内存:

WebClientLogin
ID = 900
WebClient (original instance)
ID = 1, WebClientLogin_Id = 900, WebClientLogin = null
WebClient  (new instance!)
ID = 0, WebClientLogin_Id = 900, WebClientLogin = that instance with 900

尝试更改数据库:

WebClientLogin (no change)
ID = 900
WebClient (new row, inserted)
ID = 2, WebClientLogin_Id = 900
WebClient (original row, updated)
ID = 1, WebClientLogin_Id = 900 -> null  (error, rollback transaction)

我稍微修改了存储库,但似乎它解决了这个问题,但现在我有另一个。

public bool Save(WebClientLogin login, WebClient client)
        {
            var created = false;
            using (var transaction = new TransactionScope())
            {
                try
                {
     // insert WebClientLogin first
                    tablalogin.InsertOnSubmit(login);
                    dataContext.SubmitChanges();
     // insert WebClient second
                    client.WebClientLogin_id = login.Id;
                    tablacliente.InsertOnSubmit(client);
                    dataContext.SubmitChanges();
                    created = true;
                    transaction.Complete();
                }
                catch (Exception ex)
                {
                    //
                }
            }
            return created;
        }

当有大量的用户时,我只插入WebClientLogin而不插入WebClient我得到了这个异常:

Internal .Net Framework Data Provider error 60

嗯....整个应用程序给出了大量其他奇怪的异常。所以我们拜访了我们的主人,我们发现了导致它的原因。主机配置了3台专用web服务器和1台数据库服务器。他们为web服务器配置了负载平衡器和dfs。他们关闭了3个服务器中的2个,并进行了压力测试。从那时起,没有错误/异常或错误的事务。好像是服务器问题。