Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq to SQL和Azure无法返回我知道存在的记录_C#_Linq_Azure - Fatal编程技术网

C# Linq to SQL和Azure无法返回我知道存在的记录

C# Linq to SQL和Azure无法返回我知道存在的记录,c#,linq,azure,C#,Linq,Azure,标题说明了这一点。在下面的代码中,我得到了一个重复PK值的insert异常。这种情况极为罕见,但足以让100多名用户每周使用一次或更多 var prefs = userPrefs.FirstOrDefault(u => u.Id == User.Id); if (prefs == null) { // prefs = userPrefs.FirstOrDefault(u => u.Id == User.Id); // LogSomethingIfPrefsIsNotN

标题说明了这一点。在下面的代码中,我得到了一个重复PK值的insert异常。这种情况极为罕见,但足以让100多名用户每周使用一次或更多

var prefs = userPrefs.FirstOrDefault(u => u.Id == User.Id);
if (prefs == null) {
    // prefs = userPrefs.FirstOrDefault(u => u.Id == User.Id);
    // LogSomethingIfPrefsIsNotNull();
    prefs = new UserPreferences { Id = User.Id, OtherProperties = Values };
    userPrefs.InsertOnSubmit(prefs);
    context.SubmitChanges();
}
我无法理解插入怎么会失败。PK是一个整数,但是我有另一个表,其中包含两个键的
string
字段。它也很少失败

我尝试添加一个重复的检查和日志记录(参见注释行)。低,看,它确实找到了第二次检查的记录,它确实记录

这怎么可能呢?没有其他内容正在写入数据库

[编辑]:根据@KasparsOzols和@JamieRees的评论,我查看了该代码的调用位置。有一个在
HttpPost
方法中。我想用户可以双击submit按钮来实现这一点。让我们忽略这一点

另一段代码的工作方式完全不同。它不在可以同时在另一个线程中执行的代码段中。它不查找主键。相反,它基于另外两个字段进行查找。如果找不到,则执行插入。如果我们看这个表,有重复的记录

因此,添加了与我在上面注释的日志相同的日志。它验证对
FirstOrDefault
的第一次调用是否失败,第二次调用是否有效

我已经把代码贴在下面了。此外,我从第三个失败的地方复制了准确的代码

// Co-worker's code in another section that cannot be hit simultaneously.
// PK here is an ID field. Not alias or orgname.
// Logging code is removed for comments
shop = shopTable.FirstOrDefault(o => (o.OrgName.Equals(tempOrg) && o.AliasName.Equals(tempAlias)));
if (shop == null) {
   // Log that we didn't find it.
   var shop2 = shopTable.FirstOrDefault(o => (o.OrgName.Equals(tempOrg) && o.AliasName.Equals(tempAlias)));       
    // Log if we found it this time or not. This sometimes actually does find it.
}


// Additional code of mine that is also in an HttpPost.
// This code is an exact copy/paste from the app. The insert fails sometimes.
var charts = context.GetTable<MsoUserCharts>();
var chartRecord = charts.FirstOrDefault(o => o.Organization == organization && o.Username == username);
if (chartRecord == null) {
   chartRecord = StaticVariables.GetNewChartRecord(organization, username);
   charts.InsertOnSubmit(chartRecord);
   context.SubmitChanges();
}
//同事的代码位于另一个无法同时命中的部分中。
//这里是一个ID字段。不是别名或组织名。
//删除注释的日志代码
shop=shopTable.FirstOrDefault(o=>(o.OrgName.Equals(tempOrg)和&o.AliasName.Equals(tempAlias));
if(shop==null){
//记录我们没有找到它。
var shop2=shopTable.FirstOrDefault(o=>(o.OrgName.Equals(tempOrg)和&o.AliasName.Equals(tempAlias));
//记录我们这次是否找到它。有时确实找到了。
}
//我的附加代码也在HttpPost中。
//此代码是应用程序的精确复制/粘贴。插入有时会失败。
var charts=context.GetTable();
var chartRecord=charts.FirstOrDefault(o=>o.Organization==Organization&&o.Username==Username);
if(chartRecord==null){
chartRecord=StaticVariables.GetNewChartRecord(组织,用户名);
图表。InsertOnSubmit(图表记录);
context.SubmitChanges();
}

可能使用
userPrefs.Any(u=>u.Id==User.Id)
返回bool?我不确定这会有什么不同。即使它能工作,我的整个应用程序都坏了。如果不能信任
FirstOrDefault()
,那么在插入任何记录之前,我总是需要插入
Any()
语句。到目前为止,总共有三个地方没有成功。但是使用了30多个表,并且在许多其他地方插入都可能失败。我个人对
FirstOrDefault()没有任何问题
是否可能有两个线程在几乎相同的时间使用相同的
用户Id执行该代码?在您的代码中,您似乎正在将用户Id分配给首选项Id。首选项Id应由db自动分配,而不是由您的应用程序自动分配。请指定调用上述代码的时间(根据请求、用户提交时等)。另外,如果您在Azure上运行,并且已经设置了网站自动伸缩,那么此代码可能会同时在两个不同的服务器上执行。另外,请确保不要在同一个上下文实例上两次调用
SubmitChanges
,因为这可能会导致多次插入。