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
我不知道它为什么这样做!有人有过类似的经历吗?
数据库启动状态:
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个,并进行了压力测试。从那时起,没有错误/异常或错误的事务。好像是服务器问题。