【问题标题】:Assign Entity Framework Navigation Property without Query分配没有查询的实体框架导航属性
【发布时间】:2016-12-03 20:05:44
【问题描述】:

我正在使用实体框架 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; }
}

并且 selectList 的内容进入 html 表单中的下拉列表。接下来,CategoryId 在用户提交表单时被发送回服务器。从那里,我目前正在执行以下操作来保存更改:

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

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

所以我的问题如下:我可以在不使用db.Widgets.Find(WidgetId) 进行另一个数据库查找的情况下分配类别导航属性吗?做查找。此外,如果您有大约五个导航属性的东西,这似乎是一个重大的性能问题,每个这些属性都需要往返。

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    您可以使用构造函数创建新实体,并为其分配适当的 id 然后像这样使用 dbContext 的 Entry().State:

    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(即它不存在) - 这会引发错误吗?
    • 取决于天气与否您在数据库中定义了外键关系。这段代码所做的只是将 CategoryId 设置为您在代码中实例化的类别的 Id。如果数据库中有外键约束 - SaveChanges - 将抛出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多