2013-01-18 38 views
0

我是新來的MVC,並試圖添加/編輯主細節形式的記錄。在插入記錄時,masterid和detailid都由oracle生成。因此,當我嘗試調用DBContext.SaveChanges()時,我得到的錯誤是外鍵被違反,並且沒有找到ID爲'0'的主行。ASP.net MVC - 主細節 - 外鍵總是爲零

下面是類的描述。

public class Master 
{ 
    public int MasterID { get; set; } 
    public string MasterTitle { get; set; } 
    public virtual IList<Detail> Details { get; set; } 
} 

public class Detail 
{ 
    public int DetailID { get; set; } 
    public int MasterID { get; set; } 

    public string DetailName { get; set; } 
    public virtual Master Master { get; set; } 
} 

控制器代碼

[HttpPost] 
    public ActionResult Create(MASTER masterrecord) 
{ 
    if (ModelState.IsValid) 
    { 
     db.MASTER.Add(masterrecord); 
     db.SaveChanges(); 
    } 
    ... 
} 

的主鍵(masterid)將獲得記錄被插入到數據庫後纔有意義的值。 context.SaveChanges()此時嘗試用'0'masterid保存客戶端記錄。我搜索了哪裏找不到任何有用的東西。

雖然只保存主表,所以我可以檢索masterid和我們與細節模型。但無法找到任何地方如何使用EF5 MVC ASP.NET 任何人可以指出我正確的方向提供一些工作示例? 謝謝 Siddhant

+0

一個贊成和反對的名單做工精細用SQLEXPRESS – ZedBee

+0

我使用的是Oracle。 PK是從序列生成的,我使用Before Row Insert Trigger加檢查條件,如果PK COLUMN(我的例子中的MASTERID)= 0 –

回答

0

您可能會考慮使用GUID而不是整數作爲您的PK。然後在你的Master的構造函數中,你可以說MasterID = Guid.NewGuid();。通過這種方式,您不必訪問數據庫以查明下一個ID是什麼。

這裏有http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html

+0

謝謝。使用GUID似乎是正確的方式來轉發我的應用程序。我並不擔心oracle使用GUID的性能,因爲我不希望每年有超過幾千條記錄。 –

+0

但是,MVC/EF5應該有一些處理這種情況的方法,你不這麼認爲嗎? –

0

如果您在Create方法上設置了一個斷點並且正在Master對象中獲取正確的列表,那麼這可能是Oracle提供者的問題。

作爲一種變通方法,你可以嘗試改變方法簽名接受類似下面的數據:

public ActionResult Create(MASTER masterrecord, List<Detail> details) 

然後,你可以先保存masterrecord,隨後加入您的詳細資料,並再次保存。這不是最佳的,但它可能工作。

備註:將您的IList更改爲ICollection。