0

假设我的实体类上有一堆布尔属性public bool isActive等。这些值将通过在 Web 应用程序中设置复选框来操作。我将一次只发回一个更改的名称/值对和主键,比如说 { isActive : true , NewsPageID: 34 },默认模型绑定器将创建一个仅设置这两个属性的 NewsPage 对象。现在,如果我运行下面的代码,它不仅会更新已在模型绑定器创建的 NewsPage 对象上设置的属性的值,而且当然还会尝试将现有实体对象的所有其他未设置值设为空,因为它们未在模型绑定器创建的 NewsPage 对象上设置。

是否有可能以某种方式告诉实体框架不要查看设置为 null 的属性并尝试将这些更改持久化回检索到的实体对象并因此保留到数据库?也许我可以编写一些代码,它们只会利用模型绑定器创建的 NewsPage 对象上的非空值及其属性名称,并且只尝试更新那些特定的属性?

    [HttpPost]
    public PartialViewResult SaveNews(NewsPage Np)
    {
        Np.ModifyDate = DateTime.Now;
        _db.NewsPages.Attach(Np);
        _db.ObjectStateManager.ChangeObjectState(Np, System.Data.EntityState.Modified);
        _db.SaveChanges();
        _db.Dispose();


        return PartialView("MonthNewsData");
    }

我当然可以做类似下面的事情,但我觉得这不是最佳解决方案。特别是考虑到我需要设置 6 个布尔属性。

[HttpPost]
public PartialViewResult SaveNews(int NewsPageID, bool isActive, bool isOnFrontPage)
{
        if (isActive != null)   { //Get entity and update this property }
        if (isOnFontPage != null) { //Get entity and update this property }
}
4

3 回答 3

1

API 不是强类型的,但您可以按如下方式进行。DbContextAPI对此有更好的支持。

[HttpPost]
public PartialViewResult SaveNews(NewsPage Np)
{
    Np.ModifyDate = DateTime.Now;
    _db.NewsPages.Attach(Np);
    var entry = _db.ObjectStateManager.GetObjectStateEntry(Np);

    var cv = entry.CurrentValues;

    if (isActive)
    {
        cv.SetBoolean(cv.GetOrdinal("isActive"), true);
    }

    _db.SaveChanges();
    _db.Dispose();

    return PartialView("MonthNewsData");
}
于 2012-07-06T03:59:32.470 回答
0

你可以选择两种选择

  1. 为该操作注册一个自定义模型绑定器。在自定义模型绑定器中,您必须从数据库中获取完整的对象并且只更新 POSTed 属性。

  2. 使用视图模型。而不是直接将NewsPage模型作为动作参数。您可以创建一个包含必要属性的自定义视图模型。在操作中,您必须调用 db 以获取完整的NewsPage实例并仅更新视图模型中的相应属性。

于 2012-07-06T03:58:14.453 回答
0

有点丑陋,但在我的情况下,无需创建和注册自定义模型绑定器或使用多个 if 语句就可以解决问题。

    [HttpPost]
    public void SaveNews(string propname, bool propvalue, int PageID)
    {
        var prop = typeof(NewsPage).GetProperties().FirstOrDefault(x => x.Name.ToLower() == propname.ToLower());
        var Np = _db.NewsPages.FirstOrDefault(x => x.PageID == PageID);
        prop.SetValue(Np, propvalue, null);

         Np.ModifyDate = DateTime.Now;
        _db.SaveChanges();
        _db.Dispose();

    }
于 2012-07-06T05:27:20.790 回答