2011-05-25 27 views
0

我有一个解决方案,其数据后端使用Fluent nHibernate,并且我在前端使用ASP.NET MVC 3.0。我以为我很聪明,用Model View ViewModel的方法来解决一些事情,但它有点让我反感......使用ASP.NET MVC 3.0中的数据模型同步视图模型

这是我的模型。

class Alpha { 
    virtual Guid Id { get; set; } 
    virtual string Name { get; set; } 
    virtual IList<Delta> ListOfItems { get; set; } 
} 

class Delta { 
    virtual Guid Id { get; set; } 
    virtual string Name { get; set; } 
    // some other properties 
} 

工程很好。现在,这里是我的AlphaViewModel

class AlphaViewModel { 
    string Name { get; set; } 
    IList<Delta> ListOfItems { get; set; } 
} 

我使用视图模型,以避免与代理冲突。因为我知道第一个问题将是“您的视图模型看起来就像您的模型,使用它没有意义”。这工作正常,但现在这里出现我的问题。

想象一下下面的过程..

  • 用户创建阿尔法通过使用AlphaViewModel
  • 数据库保存阿尔法
  • 用户通过添加的新实例三角洲ListOfItems property
  • 数据库保存Alpha,以及新的Delta Delta项目。
  • 用户编辑阿尔法
  • 用户删除三角洲
  • 数据库的1个实例去拯救...

现在我们有一个新的问题。数据库并不知道它正在改变的Id

我可以将Id添加到ViewModel,但这并不能解决所有问题。我已经看到人们如何处理这种情况与新增新项目,但我找不到任何好的解决方案,显示他们删除他们以及。谁能提供一些见解?

我知道这个问题与nHibernate无关,但由于我的部分推理涉及到nHibernate代理,因此我将它作为我的标签条的一部分,因为它可能是解决方案/问题的一部分。

回答

1

更好地设计你的表单。你没有“删除”每个项目的链接或复选框?

(恕我直言,这是一个不存在的问题)

+0

从表单删除它们是不是问题 - 问题是,当回发到控制器,与数据库存储的模型同步的。 – Ciel 2011-05-25 13:16:10

+0

我不明白为什么。 “Delta”的适当视图模型将指示用户选择删除哪些项目(如果您使用复选框)。如果您使用的是删除链接,则可以通过ajax删除Delta项目。 – jgauffin 2011-05-25 13:23:14

+0

这不是问题的关键。数据存储在ViewModels中,而不是原始模型。嵌套数据也是一个ViewModel。同步嵌套数据将删除原始数据并根据ViewModel重新创建新对象,从而导致关联问题。我不能说'Session.SaveOrUpdate(viewModel);'。如果我使用赋值操作符将“Delta”对象分配给所有者,那么它会在数据库将其推入时删除先前的关联。 – Ciel 2011-05-25 18:07:00

相关问题