2012-12-20 19 views
1

我有兩個簡單的模型,有一個一對多的關係簡單的插入通過ASP MVC3的EntityFramework

public class X{ 
    public int id {get;set;} 
    public virtual Y y{ get; set; } 
    public string description{get;set;} 
} 
public class Y{ 
    public int id{get;set;} 
    public string name{get;set;} 
} 

,並從實體框架,我設置

我試圖提交創建表格的關係一個新的X記錄與現有的Y

從窗體返回的行爲數據是string description和。

的動作時,我嘗試從

public ActionResult sth(X x){} 

x.y設置爲空(預計...),而當我試着下面的參數指定的對象...

x.y = (from i in Y where i.id == that_id select i).first(); 
... 
db.saveChanges(); 

實體框架插入一個新的Y記錄到數據庫中...

我知道我做錯了什麼......你的幫助將是v非常感謝!

回答

1

跟蹤dbContext中的Y對象似乎是個問題。你如何生成你用linq查詢的集合?你使用dbContext從數據庫中獲取它嗎?或來自其他來源?

如果不是,您需要使用上下文或使用Attach()函數獲取它,以便可以正確跟蹤它。

另一個問題彈出。如何插入新的Y?你沒有在數據庫中定義主鍵嗎?或者它試圖插入然後引發異常?

這些是我對這件事的想法。

+0

先生,'y'是由相同的數據庫上下文中的linq查詢生成的,插入的ID是db身份被替換爲一個新的...我將嘗試attach方法並查看會發生什麼 – Hilmi

+0

Sir ,附加方法工作完美,只是你能告訴我爲什麼發生這個問題,是因爲'Y'是虛擬成員(它沒有連接到控制器數據庫上下文)?非常感謝先生, – Hilmi

5

看着你的代碼,你有一個X和Y的虛擬Y在X中的ID。隨着這個虛擬Y在x中,你還需要一個對y的id的引用。隨着x的y虛擬ICollection。

public class X{ 
    public int x_id {get;set;} 
    public int y_id {get;set} 
    public virtual Y y{ get; set; } 
    public string description{get;set;} 
} 
public class Y{ 
    public int y_id{get;set;} 
    public string name{get;set;} 
    public virtual ICollection<X> X {get;set;} 
} 

這有助於實體間的關係。您可能還想將y(s)列表傳遞給負責您表單的控制器,除非您已從表單的下拉列表中選擇y值。

+0

先生,當我做了以下的遷移腳本將重新命名從列(「y_id」)到列(「Y_id1」)'並添加一個新列名爲'「Y_id」' – Hilmi

+0

沒有太多儘管取決於您的應用程序處於什麼階段,但您可能需要查看在對模型進行更改時刪除和重新創建數據庫的情況,但它有助於快速開發並避免遷移,直到您達到部署階段。 http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/intro-to-aspnet-mvc-3應該告訴你如何。 – doreye01

+0

先生,我的數據庫擁有大量的數據,如果您不同意我的觀點,我無法對每一項變更進行娛樂和重新填充數據庫。 – Hilmi