在关于Entity Framework和MERGE的SO答案中,如何编写代码的示例如下:
public void SaveOrUpdate(MyEntity entity)
{
if (entity.Id == 0)
{
context.MyEntities.AddObject(entity);
}
else
{
context.MyEntities.Attach(entity);
context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
}
假设您已经知道要升级的实体是否存在;在这种情况下,请检查entity.Id
。但是,如果您不知道该商品是否存在该怎么办?例如,就我而言,我正在将供应商的记录导入到数据库中,并且给定的记录可能已经导入,也可能尚未导入。我想更新记录(如果存在),否则添加它。但是两种情况下都已经设置了供应商的ID。
除非我简单地询问数据库记录是否已经存在,否则我看不到任何处理方法,这违背了MERGE的全部目的。
如果您想要一个没有存储过程的原子数据库UPSERT命令,并且您不担心上下文被更新,那么值得一提的是,您还可以MERGE
在ExecuteSqlCommand
调用中包装一个嵌入式语句:
public void SaveOrUpdate(MyEntity entity)
{
var sql = @"MERGE INTO MyEntity
USING
(
SELECT @id as Id
@myField AS MyField
) AS entity
ON MyEntity.Id = entity.Id
WHEN MATCHED THEN
UPDATE
SET Id = @id
MyField = @myField
WHEN NOT MATCHED THEN
INSERT (Id, MyField)
VALUES (@Id, @myField);"
object[] parameters = {
new SqlParameter("@id", entity.Id),
new SqlParameter("@myField", entity.myField)
};
context.Database.ExecuteSqlCommand(sql, parameters);
}
这不是很漂亮,因为它在EF对实体的抽象之外起作用,但是它将允许您利用该MERGE
命令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句