创建Upsert函数

本文关键字:函数 Upsert 创建 | 更新日期: 2023-09-27 18:15:56

我是asp.net的新手,我不知道这是否可能。如何在ASP中创建一个UPSERT函数?当你更新一个实体,如果它不存在,它会自动插入行。

我有这个集合/实体

name travelRequest

namespace TRS.Entities
{
   [Table("travelRequest")]
    public class travelRequest
    {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int travelRequestID { get; set; }
    //...
    public virtual IList<trTravelDest> trTravelDest { get; set; }
    //...
    }

与包含

的虚列表trTravelDest
namespace TRS.Entities
{
    [Table("trTravelDest")]
    public class trTravelDest
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int trTravelDestID { get; set; }
        public int travelRequestID { get; set; } //fk from travelRequest table
        public virtual travelRequest travelRequest { get; set; }
      //...
    }
}

我在更新请求时使用此函数Update(travelRequest travelRequest),我的问题是当我在trTravelDest中添加新行时,它将忽略或不会插入。我怎么能使它自动检测travelRequest.trTravelDest Update(parameter)上有一个新的行,并自动插入它。

[HttpPost]
public ActionResult Update(travelRequest travelRequest)
{
if (TryUpdateModel(travelRequest))
 {try {
db.SaveChanges();
 // updateSuccessfull = true;
} catch{
 //  updateSuccessfull = false;}
}
var data = db.travelRequest.Find(travelRequest.travelRequestID);
return View("EditTr",data);
}

创建Upsert函数

我认为AddOrUpdate -方法正是你所需要的。

调用SaveChanges时按键添加或更新实体。等效到数据库术语中的"upsert"操作。这种方法可以是

您可以这样使用方法:

context.TravelRequests.AddOrUpdate(
    x => x.trTravelDestID,    // Assuming the travelRequest are unique on this key   
    travelRequestToUpsert);
context.SaveChanges();

第一个形参告诉函数可以根据什么属性确定对象的唯一性。这里主键是最理想的。第二个(和第三个,…)是您想要替换的对象。