C# 在不首先查询的情况下插入或更新记录?

C# 在不首先查询的情况下插入或更新记录?,c#,postgresql,entity-framework,C#,Postgresql,Entity Framework,假设我的web服务获取一些数据,如记录id和其他列值 是否有一种方法可以像AddOrUpdate(TEntity)method那样插入或更新此数据库记录,但无需首先查询?不幸的是,AddOrUpdate(tenty)首先对数据库进行select查询。否 实体框架不是这样工作的。是的,SQL支持,但不,EF不支持。要更改对象,您需要先拥有它,这是一个读取操作 Upserts-要求测试以确保数据是否存在。是的,不是最优的,但事实就是如此。您想如何更新记录而不找到它?您可以这样做。可以将对象附加到上下

假设我的web服务获取一些数据,如记录id和其他列值

是否有一种方法可以像
AddOrUpdate(TEntity)
method那样插入或更新此数据库记录,但无需首先查询?不幸的是,
AddOrUpdate(tenty)
首先对数据库进行select查询。

实体框架不是这样工作的。是的,SQL支持,但不,EF不支持。要更改对象,您需要先拥有它,这是一个读取操作


Upserts-要求测试以确保数据是否存在。是的,不是最优的,但事实就是如此。

您想如何更新记录而不找到它?您可以这样做。可以将对象附加到上下文,并将其状态设置为“添加”或“修改”。然后保存更改时,将发送相应的INSERT/UPDATE语句。是的。现在你怎么不用问就知道这个州?在一条sql语句中使用一些并不十分复杂的编程是可能的,但EF不能这样做,并且不会生成“无往返upsert样式的命令”。我知道你想提出一个神奇的独角兽解决方案——这个解决方案的问题是:它不起作用。你很容易就知道状态:OP描述他确实检索到了记录id。如果它是一个有效的id,那么它将被更新。如果它在ID约束之外无效,例如负值,则必须添加对象。然后,新id由db计算,如果没有自动增量,则由您建议的单个db调用计算。我知道这是常识(几年前一位同事在网上研究后提出的),但我想不是这样,这应该会澄清这一点。这不是真的。尝试在PK位置上拥有一个没有自动递增的表,并将一个新对象附加到一个具有已存在PK和已添加状态的新上下文,这将导致id不唯一异常,而将一个不存在PK的对象附加到修改状态将导致一个0行受影响语句。EF不需要在插入或更新之前查询数据,这是一个纯粹的ORM。