我正在ASP.NET Core 2.0上的Web api項目上工作,其中Entity Framework Core連接到了postgres數據庫。以下PUT方法可以正常工作,但我覺得我可能誤會了update方法的使用,而且我還覺得應該有一個更優雅的解決方案,以一種持有PUT請求(而不是PATCH)的方式更新現有對象)。 // PUT: api/Discount/5 [HttpPut("{id}")] [ProducesResponseType(204)] [ProducesResponseType(400)] [ProducesResponseType(404)] [ProducesResponseType(500)] public IActionResult Put(int id, [FromBody]Discount discount) { if (ModelState.IsValid) { using (var context = new BarberskabetDbContext()) { if (context.Discounts.Any(x => x.DiscountId == id && !x.Deleted)) { var dbDiscount = context.Discounts.FirstOrDefault(x => x.DiscountId == id && !x.Deleted); dbDiscount.AppliesOnce = discount.AppliesOnce; dbDiscount.AppliesToProductType = discount.AppliesToProductType; dbDiscount.Code = discount.Code; dbDiscount.DiscountType = discount.DiscountType; dbDiscount.Duration = discount.Duration; dbDiscount.DurationUsageLimit = discount.DurationUsageLimit; dbDiscount.EndsAt = discount.EndsAt; dbDiscount.OncePerCustomer = discount.OncePerCustomer; dbDiscount.RestrictByEmail = discount.RestrictByEmail; dbDiscount.StartsAt = discount.StartsAt; dbDiscount.Status = discount.Status; dbDiscount.TimesUsed = discount.TimesUsed; dbDiscount.UsageLimit = discount.UsageLimit; dbDiscount.Value = discount.Value; context.Update(dbDiscount); if (context.SaveChanges() == 0) { return StatusCode(500, "Unable to update record."); } return NoContent(); }我覺得應該有更好的方法將新信息放入數據庫中,但是我很難看到它。
1 回答

富國滬深
TA貢獻1790條經驗 獲得超9個贊
Update方法用于所謂的強制更新,即,當您確定存在的實體斷開連接時。它可以在不從數據庫加載實體的情況下工作,并且只需更新所有屬性即可。
以您的示例為例,強制更新如下所示:
if (context.Discounts.Any(x => x.DiscountId == id && !x.Deleted))
{
? ? context.Update(discount);
? ? context.SaveChanges();
}
如果只想更新已更改的屬性(如果有),則應該加載數據庫實體并使用該CurrentValues.UpdateValues方法來應用更改:
var dbDiscount = context.Discounts.FirstOrDefault(x => x.DiscountId == id && !x.Deleted);
if (dbDiscount != null)
{
? ? context.Entry(dbDiscount).CurrentValues.SetValues(discount);
? ? context.SaveChanges();
}
請注意,在這種情況下,EF可能根本不會發出更新命令(如果所有屬性值都與原始屬性值相同),即SaveChanges可以返回0,因此您不應將其用作成功的指示。實際上,您永遠不應將其用于此目的,因為EF會拋出異常,這是有問題的。
- 1 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消