C# 更正EF 6中AddOrUpdate()的多个条件
EF 6中的以下声明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
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);
。