【问题标题】:How to use Subsonic update using mvc model binding?如何使用 mvc 模型绑定使用 Subsonic 更新?
【发布时间】:2012-01-08 11:23:41
【问题描述】:

我正在使用 subsonic 在 mvc 应用程序中访问我的数据库。 当尝试使用 mvc 模型绑定更新记录时,记录不会更新,因为没有列被标记为脏。

我尝试通过调整亚音速代码手动将所有列标记为脏,但有时我只想更新一些属性,所以我不想将它们全部标记为脏。

最好的方法是什么?

这是我的行动:

        [HttpPost]
        public ActionResult Update(mapping m)
        {
           m.SetIsNew(false);
           m.Update(true); // here i tweaked the subsonic code passing true sets all the columns to be dirty and updates the record even though isLoaded=false
           return RedirectToAction("New");
        }

这就是我调整亚音速代码的方式:

public void Update(IDataProvider provider, Boolean forceUpdate){
            if(this._dirtyColumns.Count>0 || forceUpdate){
                if(forceUpdate)
                    this._dirtyColumns = this.Columns.ToList();
                _repo.Update(this,provider);
                _dirtyColumns.Clear();    
            }
            OnSaved();
       }

编辑:

我尝试了这段代码,看看问题出在哪里:

var m = new mapping { ID = 2, Name = "33" };
m.SetIsNew(false);
m.Save();

这也不起作用,列未设置为脏。似乎在使用对象初始化器时不会调用设置器,因此不会将列设置为脏。

我会假设默认的 mvc.net 模型绑定以这种方式工作,这就是记录没有被更新的原因。

编辑 2

正如 @dyork12 指出的那样,我的第一次编辑是错误的。 Subsonic 使用“isLoaded”标志,当它设置为 false 时,设置属性不会将它们设置为脏。这是 subsonic 在加载记录时使用的,以确保在加载时设置属性不会设置为脏。

但我的问题仍然是使用自动模型绑定从 mvc.net 视图编辑亚音速对象的最佳解决方法是什么。

【问题讨论】:

  • 在您看来,您是绑定 SubSonic 生成的对象还是使用 ViewModel?你见过这个吗? stackoverflow.com/questions/5491733/…
  • 为什么它们没有被标记为脏?该代码片段来自 ActiveRecord,如果您绑定到列属性,它应该都能正常工作。你在做什么不同的事情?请提供更多代码。
  • @dyork12:我在“编辑”中回答。
  • @DaveHogan:我正在接收亚音速生成的对象作为动作中的参数。我看了你链接到的答案。我不确定我是否理解那里的答案,但我尝试使用:AutoMapper.Mapper.Map(model, person);映射到新对象但无法使其工作。

标签: asp.net-mvc-3 subsonic model-binding


【解决方案1】:

我会赌一把,说我认为答案是 _isLoaded 是假的。没有看到更多代码,我无法告诉你原因。

如果创建新记录,_isNew 为真,_isLoaded 为假。保存时会执行 INSERT 并忽略脏列。

如果加载现有记录,_IsNew 为假,_isLoaded 为真。保存时会执行 UPDATE 并仅更新脏列。

您的代码片段将 _isNew 设置为 false,但未将 _isLoaded 设置为 true。列未标记为脏,因此没有任何保存。这很容易通过阅读 ActiveRecord 生成的代码来查看。

[顺便说一句,你对 setter 的看法是错误的——它们是由对象初始化器调用的。]

【讨论】:

  • 谢谢。我编辑了我的问题以纠正我的错误。我发布的代码是所有代码“映射”是它由 mvc.net 的自动模型绑定加载的亚音速对象,然后我更新。将 isLoaded 设置为 true 无济于事,因为属性不脏。有什么办法可以使用自动绑定?
【解决方案2】:

所以最初的问题(如现在所理解的)是 MVC 以某种方式加载行并为它们创建 DAL 对象而不设置 isLoaded 标志,然后对 setter 的任何调用都不会添加到dirtyColumns 列表中。在加载记录并创建 DAL 对象之后,在调用任何 setter 之前,您必须找到一种方法来设置 isLoaded。

抱歉,我不太了解 MVC,无法提供帮助,而且您没有为该部分包含任何代码。我希望插入某种事件,或从某些东西继承,或修改模板,或其他东西。一旦找到设置 isLoaded 的方法,您将解决问题。我希望。

【讨论】:

  • 谢谢,我想这是要走的路。但在我看来, isLoaded 标志的工作方式是不直观的,它不应该存在。如果 subsonic 从数据库加载记录时出现问题,它应该设置一个 Loading 标志,然后在完成后取消设置,这不应该被 subsonic 的用户看到。
  • 具有加载标志和脏标志是一种常见模式。加载的标志表示从数据库中检索到一行;脏标志表示它已被修改;它们一起涵盖了所有组合。如果您要在不使用提供的 API 的情况下加载/保存行,则您有责任根据需要了解和维护这些标志。必须正确设置它们才能使保存/更新工作。
猜你喜欢
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
相关资源
最近更新 更多