我有一个奇怪的问题,我试图弄清楚它是我的代码还是已经搞乱了数据库。我有一个WebClienteLogin表,它有一个属性Id(主键,自动增量)。当用户在网站上注册时,我插入新记录。LINQ to SQL存储库模式自动增量问题
昨天早上最后注册用户的ID值达到了9000左右,下午开始有趣地跳起来,所以下一个用户有了1200,25000 .....并且它达到了290000.但是,今天它继续正常(增加1)。从统计数据看,当有大量用户同时注册时,就会发生这种情况。
用到的技术:SQL Server 2008 R2中,ASP.NET MVC2,.NET 3.5
我使用Repository模式与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)
在日志中我得到异常:
试图删除WebClientLogin和Web客户端之间的 关系 然而,这种关系的一个外键 (WebClient.WebCLientLogin_id)不能设置。为空”异常
我不知道为什么会这样做,任何人都经历过类似的事情
感谢您的回复。所有似乎都是正确的,WebClientLogin属性正确分配。这是相当困难的情况,因为它只发生在用户“轰炸”注册表时,所以我实际上无法调试它。我将不得不写入记录每个正在注册的用户的属性值。 – 2011-05-05 12:23:11
在这种情况下,我会实际记录一切。您还应该为您的应用程序构建一个压力测试,并针对您的本地调试代码运行该测试,以模拟注册轰炸并重现问题。 – 2011-07-12 18:06:15