分配实体框架导航属性没有查询
问题描述:
我与实体框架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();
感谢亚历克斯,这个伟大的工程!出于好奇,让我说我分配了一个不正确的ID(即它不存在) - 这是否会引发错误? – Ben
取决于天气与否,您在数据库中定义了外键关系。 所有这些代码都将CategoryId设置为您在代码中实例化的类别的Id。如果数据库中存在外键约束 - SaveChanges - 将抛出。 –