Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate ASP.NET MVC 3.0中视图模型与数据模型的同步_Nhibernate_Asp.net Mvc 3_Fluent Nhibernate - Fatal编程技术网

Nhibernate ASP.NET MVC 3.0中视图模型与数据模型的同步

Nhibernate ASP.NET MVC 3.0中视图模型与数据模型的同步,nhibernate,asp.net-mvc-3,fluent-nhibernate,Nhibernate,Asp.net Mvc 3,Fluent Nhibernate,我有一个解决方案,它的数据后端使用Fluent nHibernate,前端使用ASP.NET MVC 3.0。我原以为我很聪明,用模型-视图-视图-模型的方法解决了一些问题,但结果适得其反 这是我的模型 class Alpha { virtual Guid Id { get; set; } virtual string Name { get; set; } virtual IList<Delta> ListOfItems { get; set; } } class De

我有一个解决方案,它的数据后端使用
Fluent nHibernate
,前端使用
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
}
阿尔法类{
虚拟Guid Id{get;set;}
虚拟字符串名称{get;set;}
虚拟IList列表项{get;set;}
}
类三角洲{
虚拟Guid Id{get;set;}
虚拟字符串名称{get;set;}
//其他一些属性
}
效果很好。这是我的AlphaViewModel

class AlphaViewModel {
  string Name { get; set; }
  IList<Delta> ListOfItems { get; set; }
}
类AlphaViewModel{
字符串名称{get;set;}
IList ListOfItems{get;set;}
}
我使用视图模型来避免与代理冲突。因为我知道第一个问题是“你的视图模型看起来就像你的模型,使用它没有任何意义”。这很好,但现在我的问题来了

想象一下下面的过程

  • 用户通过使用AlphaViewModel创建Alpha
  • 数据库保存Alpha
  • 用户通过ListOfItems属性添加Delta的新实例
  • 数据库保存Alpha,以及新的Delta
  • 用户编辑Alpha
  • 用户删除增量的1个实例
  • 数据库将保存
现在我们有了一个新问题。数据库并不真正知道它正在更改的内容的
Id

我可以向ViewModel添加一个
Id
,但这并不能解决所有问题。我已经了解了人们如何通过添加新项目来处理这种情况,但是我找不到任何好的解决方案来向他们展示如何删除新项目。有人能提供一些见解吗


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

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


(我不知道这是一个不存在的问题)

从表单中删除它们不是问题-问题是当它发回控制器,与数据库存储模型同步时。我不明白为什么。
Delta
的适当视图模型将指示用户选择删除的项目(如果使用复选框)。如果您使用的是删除链接,
Delta
项将通过ajax删除。这不是问题的关键。数据存储在ViewModels中,而不是原始模型中。嵌套数据也是一个ViewModel。同步嵌套数据将删除原始数据,并基于ViewModel重新创建新对象,从而导致关联问题。我不能只说
Session.SaveOrUpdate(viewModel)。如果我使用赋值操作符将
Delta
对象分配给所有者,那么当数据库推送它通过时,它会删除以前的关联。您描述的方法只有在ViewModel与基础数据完全匹配时才有效,而它不-不应该这样。否。我是说您应该使用Id来匹配db模型和视图模型。