2016-12-03 90 views
1

我與實體框架6的ASP MVC5應用程序的工作,並希望創建一個具有導航屬性,像這樣的對象:分配實體框架導航屬性沒有查詢

public class widget 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Category Category { get; set; } 
} 

其中財產Category是另一個實體在數據庫模型中。當我實現CRUD功能,我創建一個視圖模型,像這樣:

public class EditWidgetViewModel 
{ 
    public List<SelectListItem> Categories { get; set; } 
    public int CategoryId { get; set; } 
} 

和選擇列表的內容轉到HTML表單下拉。接下來,CategoryId在用戶提交表單時被髮回服務器。從那裏,我目前在做類似下面的保存更改:

var dbWidget = new Widget 
{ 
    Name = model.Name, 
    Category = db.Categories.Find(CategoryId) 
} 

db.Widgets.Add(dbWidget); 
db.SaveChanges(); 

所以我的問題是:我可以指定類別的導航屬性,而不做其他數據庫查詢與db.Widgets.Find(WidgetId) - 我已經知道ID號應該在數據庫的Widgets表格的Category_Category_Id列中進行查找。此外,看起來好像您擁有5個左右的導航屬性,這對於每個導航屬性來說都是一個重要的性能問題。

回答

0

您可以創建一個構造一個新的實體,它分配一個正確的ID 然後使用的DbContext的輸入()狀態是這樣的:

Category category = new Category { Id = CategoryId }; 
db.Entry(category).State = EntityState.Unchanged; 

var dbWidget = new Widget 
{ 
    Name = model.Name, 
    Category = category 
} 

db.Widgets.Add(dbWidget); 
db.SaveChanges(); 
+0

感謝亞歷克斯,這個偉大的工程!出於好奇,讓我說我分配了一個不正確的ID(即它不存在) - 這是否會引發錯誤? – Ben

+0

取決於天氣與否,您在數據庫中定義了外鍵關係。 所有這些代碼都將CategoryId設置爲您在代碼中實例化的類別的Id。如果數據庫中存在外鍵約束 - SaveChanges - 將拋出。 –