c# - 带有 ASP.NET MVC 的 Entity Framework

标签 c# .net asp.net asp.net-mvc entity-framework

如何将强类型 Controller 与 EntityObject 一起使用?

我的失败...

首先我尝试了这个:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
    db.SaveChanges();
    return RedirectToAction("Index");
}

这实际上未能将任何更改保存到数据库中。因此,我尝试将模型附加到我的 ObjectContext:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
    db.Attach(Model);
    db.SaveChanges();
    return RedirectToAction("Index");
}

这失败了,因为“无法将具有空 EntityKey 值的对象附加到对象上下文。”所以,我尝试分配 EntityKey:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
    Model.EntityKey = (from Department d in db.Department
                       where d.Id == id
                       select d).FirstOrDefault().EntityKey;
    db.Attach(Model);
    db.SaveChanges();
    return RedirectToAction("Index");
}

这失败了,因为“ObjectStateManager 中已经存在具有相同键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。”

这应该如何工作?

最佳答案

问题是,您作为输入所拥有的不是具有更改属性的完整模型对象 - 它只是新对象的“开始”,具有您想要覆盖现有实体的所有属性。您不发布任何 ID 属性,

这看起来有点冗长,但它是我发现的最好的,所以我在我的项目中就是这样做的(根据你的类名进行调整,遗漏的任何内容都补上...):

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
    var dbDepartment = (from Department d in db.Department
                        where d.Id == id
                        select d).FirstOrDefault() as Department

    dbDepartment.Name = Model.Name;
    dbDepartment.Color = Model.Color;
    // etc, assigning values manually...

    try
    {
        db.SaveChanges();
    }
    catch (Exception ex)
    {
        // oops...
    }
    return RedirectToAction("Index");
}

关于c# - 带有 ASP.NET MVC 的 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/895564/

相关文章:

c# - Gridview 标题链接按钮未更新

c# - 从 Active Directory 获取用户名

c# - 运行位于 PATH 环境变量目录中的应用程序

c# - 如何避免重新初始化一个永不更改的类?

c# - 如何在C#中显示字符 "\0"

c# - 使用后台线程从 xml 文件加载内容?

.net - Entity Framework 中联接表的导航属性

c# - 如何从 WPF 应用程序方法运行 Windows 服务应用程序

javascript - 如何从 HTML 集合中提取名称?

asp.net - 当托管在 IIS (ASP.NET) 上时,Quartz 在后台运行多长时间?