2015-10-05 103 views
1

即時通訊新的在asp.net中,我不知道這是否可能。我如何在ASP.NET C#中創建一個UPSERT函數在哪裏更新一個實體,如果它不存在,它會自動插入該行。創建Upsert函數ASP.NET

我有這個集合/實體

travelRequest

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

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我的問題是,當我在trTravelDest中添加一個新行,它將忽略或不會插入。我如何使它自動檢測,如果travelRequest.trTravelDestUpdate(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); 
} 
+0

最簡單的事情就是檢查實體的ID字段。我會假設你有這個,並且你可以檢索你的實體。如果您的ID爲0,那麼它不存在於數據庫中,然後將其插入到數據庫中。 – hbulens

+0

哪個版本的實體框架?從EF6 +你有方便.AddOrUpdate()方法 –

+0

我想知道。我假設traveldest是旅行請求中的許多地方之一。難道不同的旅行要求可以有相同的旅行嗎?如果是這樣,那麼你就不要在旅行中使用外鍵 –

回答

3

我認爲AddOrUpdate -method正是你所需要的。

調用SaveChanges時,通過鍵添加或更新實體。等同於 到數據庫術語的「upsert」操作。在使用遷移種子數據時,此方法可以是 。

您使用的方法是這樣的:

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

第一個參數告訴什麼屬性就可以確定對象如何是唯一的功能。主鍵是理想的。第二個(和第三個,......)是您想要插入的對象。

+0

db.travelRequest.AddOrUpdate(x => x.travelRequestID,travelRequest); db.SaveChanges(); ??我會試着看看如何使用該方法。謝謝你的迴應! –

+0

的確,我編輯了答案。 – Thijs