繁体   English   中英

更新实体,所有更改均不保存

[英]Updating entity, all changes not saving

我搜索了这个话题,我意识到有一个略微相关的问题在这里 ,虽然这个问题听起来很相似,接受的解决方案没有工作(其中,如果读取的意见,人会知道,这个问题是不是真的解决了)。

这是我的问题,希望有人能提供帮助:

我有一个实体:

public class Garden
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual PlantHardinessZone Zone { get; set; }
}

它与PlantHardinessZone实体有关系:

public class PlantHardinessZone
{
    public int Id { get; set; }
    public string Zone { get; set; }
}

为了轻松使用DropDownListFor中的区域,我创建了一个ViewModel:

public class GardenViewModel
{
    public int ZoneId { get; set; }
    public IEnumerable<PlantHardinessZone> Zones { get; set; }

    public Garden Garden { get; set; }
}

此ViewModel在多个视图中使用。 目前,它可以按预期的方式用于创建新的Garden实体,但是,“编辑”无法正常运行。 如果更改区域,则不会在数据库中更新区域。 我已逐步完成代码,并且正确的Zone信息是从View返回的,只是没有更新。 如果我更改花园的名称,则可以更新。

这是[HttpPost}编辑操作:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(GardenViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            Garden garden = viewModel.Garden;
            garden.Zone = db.Zones.Where(z => z.Id == viewModel.ZoneId).Single();
            db.Gardens.Attach(garden); // per the solution accepted [here][2]
            db.Entry(garden).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(viewModel);
    }

这是对应的视图:

@model GardenManager.Web.ViewModels.GardenViewModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Garden</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.Garden.Id)

        <div class="form-group">
            @Html.LabelFor(model => model.Garden.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Garden.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Garden.Name, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-10 col-md-offset-2">
                @Html.DropDownListFor(model => model.ZoneId,
                new SelectList(Model.Zones, "Id", "Zone", Model.ZoneId),
                "Select Zone", new { @class = "form-control" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

谁能帮助我解决这个非常烦人的问题? 欢迎所有意见。 非常感谢!

您将“ 花园”的状态设置为“已Modified但这对导航属性(指向Zone的链接)没有任何影响。 因此,EF将仅更新Garden ,而不会影响链接的区域

但是,如果您通过其IDZone分配给garden.ZoneId ,那将起作用。 garden.ZoneIdGarden的直接财产,它将使所有内容正确链接。

garden.ZoneId = db.Zones.Where(z => z.Id == viewModel.ZoneId).Single().Id;

概括一下:
garden.Zone 不是对象的真实属性 ,它只是EF在后台处理的链接。 这就是为什么更新失败。
garden.ZoneId 对象的真实属性 ,因此,如果更改它,它将正确更新。

db.Gardens.Attach(garden); 仅附加garden对象。 它不附加可能链接到它的其他对象。

另外,我建议先将实体附加到上下文,然后再更改其属性和状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM