这是我的第一篇文章。我不熟悉c#。我有以下代码添加或更新表格如下。
context.Configuration.AddOrUpdate(
c => c.ClientSiteId,
new List.Configuration
{
ClientSiteId = 0,
APIUserName = "Name",
APIPassword = "Password"
});
我如何告诉上面检查clientiteid是否存在它不应该更新,如果没有clientiteid为0那么它应该添加。
我知道你可以使用Any()
,我不知道如何使用它。
答案 0 :(得分:3)
我运行FirstOrDefault(c => c.ClientSiteId)来获取具有该ID的DB对象,如果它存在,那么该对象将被填充并且可以被修改,如果它不存在然后将返回默认值,此时您可以更改它们然后提交。
答案 1 :(得分:1)
听起来您只想使用Add
,而不是AddOrUpdate
。当然,另一部分是我们需要做的事情,如果已经存在的话。 最简单的解决方案是为了确保存在合适的唯一约束,如果您尝试复制,只需让它爆炸。更优雅的基于ORM的方法可能是尝试找到项目,如果它不存在 - 添加它;即。
var newObj = new List.Configuration
{
ClientSiteId = 0,
APIUserName = "Name",
APIPassword = "Password"
}
// ...
var item = dbSet.SingleOrDefault(x => x.ClientSiteId == newObj.ClientSiteId);
if(item == null) {
dbSet.Add(newObj);
} else {
// do something graceful, like tell the user
}
请注意,由于竞争条件,如果唯一性很重要,这种检查仍应与DB级约束配对。
你可能可以使用Any
代替SingleOrDefault
,但是......真的,由你决定;例如:
if(!dbSet.Any(x => x.ClientSiteId == newObj.ClientSiteId)) {
// add
} else {
// graceful error
}
但最终,从null
获取SingleOrDefault
的价格与Any
一样便宜,并且在#34;优雅的错误中排除了#34}。如果您想提供以下详细信息,请执行以下操作:
throw new InvalidOperationException(
$"New configuration conflicts with {item.ClientSiteId} '{item.APIUserName}'");