分配实体框架导航属性没有查询

问题描述:

我与实体框架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个左右的导航属性,这对于每个导航属性来说都是一个重要的性能问题。

您可以创建一个构造一个新的实体,它分配一个正确的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 - 将抛出。 –