Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 更正EF 6中AddOrUpdate()的多个条件_C#_.net_Entity Framework 6_Insert Update - Fatal编程技术网

C# 更正EF 6中AddOrUpdate()的多个条件

C# 更正EF 6中AddOrUpdate()的多个条件,c#,.net,entity-framework-6,insert-update,C#,.net,Entity Framework 6,Insert Update,EF 6中的以下声明 db.ReceivedMessages.AddOrUpdate(r => r.PatientId == status.PatientId && r.DialogId == status.ConversationId, record); 产生异常: 属性表达式'r=>Convert((r.PatientId== 转换(值(ManagerDB+c__显示类6_0.status.Pa

EF 6中的以下声明

db.ReceivedMessages.AddOrUpdate(r => r.PatientId == status.PatientId && 
                                    r.DialogId == status.ConversationId, record);
产生异常:

属性表达式'r=>Convert((r.PatientId== 转换(值(ManagerDB+c__显示类6_0.status.PatientId)) AndAlso(r.DialogId)== 值(ManagerDB+c_uudisplayClass6_0.status.ConversationId))' 无效。表达式应表示一个属性:C#::“t=> t、 MyProperty'VB.Net:'Function(t)t.MyProperty'。指定时 多个属性使用匿名类型:C#:'t=>new{ t、 MyProperty1,t.MyProperty2}'VB.Net:'函数(t)新增{ t、 MyProperty1,t.MyProperty2}’

将表达式更改为:

 db.ReceivedMessages.AddOrUpdate(r => new { r.PatientId, r.DialogId }, record);
还有一个例外:

未为类型定义二进制运算符Equal 'System.Nullable'1[System.Guid]'和'System.Guid'


如何正确使用
AddOrUpdate()
按两列进行更新:如果PatientId对话框ID对存在-更新记录,如果不存在-插入新记录?

错误应在EF 6.2.0中修复:

解决方法:按照上述注释中的建议安装或插入更新:

ReceivedMessage record = db.ReceivedMessages.FirstOrDefault(p => p.PatientId == status.PatientId &&
                                                                    p.DialogId == status.ConversationId);
//  Add new if not exists
bool newRecord = false;
if (record == null)
{
    record = new ReceivedMessage();
    record.Id = Guid.NewGuid();
    newRecord = true;
}

// Save fields
// ...

// Save to DB
if (newRecord)  // Workaround for EF 6.1 bug: https://stackoverflow.com/a/44811951/630169
    db.ReceivedMessages.Add(record);
else
    db.Entry(record).CurrentValues.SetValues(record);

db.SaveChanges();

第二次尝试匿名类型是预期用途。但是,似乎存在EF实现的可空类型属性错误,这会产生第二个异常,因此您不能有效地将
AddOrUpdate
与可空属性一起使用。@IvanStoev,向他们报告一个错误?您认为
new{r.PatientId.Value,r.DialogId.Value}
是否会像预期的那样工作:如果PatientId DialogId对存在-更新记录,如果没有-插入新记录?您可以尝试,但很可能无法工作-他们需要一个表示实体属性的属性路径表达式。报告一个bug怎么样,你可以,尽管目前他们几乎把所有的精力都放在了EF Core上——我已经很长时间没有看到EF6的更新了:(@IvanStoev,另一种更新方式?LINQ?嗯,最终是“手动”方法-
var dbRecord=db.ReceivedMessages.FirstOrDefault(…);
然后根据
dbRecord==null
执行
添加
更新
,例如,对于添加类似于
db.ReceivedMessages.Add(record);
,对于更新-
db.Entry(dbRecord).CurrentValues.SetValues(record);