创建Upsert函数ASP.NET

时间:2015-10-05 07:22:54

标签: c# asp.net entity-framework linq upsert

我是asp.net的新手,我不知道这是否可行。如何在ASP.NET C#中创建UPSERT函数在何处更新实体,如果它不存在,则会自动插入该行。

我有这个集合/实体

名称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);
}

1 个答案:

答案 0 :(得分:3)

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

  

调用SaveChanges时按键添加或更新实体。当量   从数据库术语到“upsert”操作。这种方法可以   在使用迁移播种数据时非常有用。

您可以使用以下方法:

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

第一个参数告诉函数它可以确定对象如何唯一的属性。这里的主键很理想。第二个(和第三个,...)是你想要插入的对象。