C# 增加或更新实体框架上的金额

C# 增加或更新实体框架上的金额,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我如何翻译这个: INSERT INTO test (id, amount) VALUES(1, 5) ON DUPLICATE KEY UPDATE amount=amount + VALUES(amount) 使用mysql查询进入实体框架?您可以尝试以下方法: var id = 1; var amount = 5; var existing = db.Test.SingleOrDefault(x => x.Id == id); if (existing != null)

我如何翻译这个:

INSERT INTO test (id, amount) VALUES(1, 5) 
ON DUPLICATE KEY 
UPDATE amount=amount + VALUES(amount)  

使用mysql查询进入实体框架?

您可以尝试以下方法:

var id = 1;
var amount = 5;

var existing = db.Test.SingleOrDefault(x => x.Id == id);

if (existing != null)
{
    existing.Amount = existing.Amount + amount;
}
else 
{
    db.Test.Add(new Test{Id=id,Amount=amount});
}

db.SaveChanges();

提取逻辑。如图所示:

如果指定了“在重复键更新时”,并且插入了一行,这将导致在唯一索引或主键中出现重复值,则会执行旧行的更新。例如,如果列a声明为唯一且包含值1,则以下两条语句具有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;    

// And

UPDATE table SET c=c+1 WHERE a=1;
您的查询显示:插入id为1且金额为5的行,但如果存在,请将id为1的行的金额增加5

据我所知,MS-SQL不支持这种说法,因此您必须自己完成这项工作:

public void InsertOrUpdateTest(Test input)
{
    var entity = _dbContext.Test.FirstOrDefault(t => t.ID == input.ID);

    // If that record doesn't exist, create it and add it to the DbSet<Test> Tests
    if (entity== null)
    {
        entity= new Test(id = input.ID);
        _dbContext.Tests.Add(entity);
    }
    
    // Increase the amount. For a new entity this will be equal to the amount,
    // whereas an already existing entitiy gets its current value updated.
    entity.Amount += input.Amount;
    
    _dbContext.SaveChanges();
}
public void InsertOrUpdateTest(测试输入)
{
var entity=_dbContext.Test.FirstOrDefault(t=>t.ID==input.ID);
//如果该记录不存在,则创建它并将其添加到DbSet测试中
if(实体==null)
{
实体=新测试(id=输入.id);
_dbContext.Tests.Add(实体);
}
//增加金额。对于新实体,这将等于金额,
//而已经存在的实体将更新其当前值。
实体.金额+=输入.金额;
_dbContext.SaveChanges();
}

应该是
t=>t.ID==input.ID
@Mohammad谢谢,修复了。如果您在帖子中发现错误,可以单击“编辑”链接,建议进行修改。:-)