Asp.net mvc NET MVC,强类型视图;在编辑/更新项目时,我应该映射属性还是将对象附加到会话?

Asp.net mvc NET MVC,强类型视图;在编辑/更新项目时,我应该映射属性还是将对象附加到会话?,asp.net-mvc,nhibernate,domain-driven-design,Asp.net Mvc,Nhibernate,Domain Driven Design,我在这里试图理解DDD,我在某个地方读到过,可以将域实体重用为viewmodels。我已经创建了一个简单的CRUD应用程序,但在U(pdate),我有点被困在“??” 我将nhibernate与每个请求的会话模式一起使用(“事务”是一个自定义属性)。但“项目”并没有“跟踪”(它是暂时的)到nhibernate会话。将“项”中的更改放入数据库中相应行的首选方法是什么 我自己也在考虑以下选择: 将所有属性映射到持久的“项”,以便(在“?”处): 将该项目附在会议上: // of course

我在这里试图理解DDD,我在某个地方读到过,可以将域实体重用为viewmodels。我已经创建了一个简单的CRUD应用程序,但在U(pdate),我有点被困在“??”

我将nhibernate与每个请求的会话模式一起使用(“事务”是一个自定义属性)。但“项目”并没有“跟踪”(它是暂时的)到nhibernate会话。将“项”中的更改放入数据库中相应行的首选方法是什么

我自己也在考虑以下选择:

  • 将所有属性映射到持久的“项”,以便(在“?”处):

  • 将该项目附在会议上:

     // of course session would be abstracted away, but for brevity pretend it gets injected into the controller
     session.Update(item);
    
  • 我的设计是完全错误的,我需要(例如)不使用每个请求的会话

你对此有什么想法?

嗯,很棘手,因为我知道MVC,但不知道NHibernate。虽然我知道实体框架,但我认为它们足够相似,因此我希望这仍然有用:

我会这样做:

//get the original item from the DB
var fromDB = _itemDomainService.GetById(item.Id);

//update fromDB with values from the current "Item" that was posted
UpdateModel(fromDB);

//then save the changes that were made
_itemDomainService.SaveChanges();
//this last line is how it is done in Entity Framework - but I guess there is something similar in NHibernate

嗯,很棘手,因为我知道MVC,但不知道NHibernate。虽然我知道实体框架,但我认为它们足够相似,因此我希望这仍然有用:

我会这样做:

//get the original item from the DB
var fromDB = _itemDomainService.GetById(item.Id);

//update fromDB with values from the current "Item" that was posted
UpdateModel(fromDB);

//then save the changes that were made
_itemDomainService.SaveChanges();
//this last line is how it is done in Entity Framework - but I guess there is something similar in NHibernate

通常认为在控制器和视图之间传递DTO(数据传输对象)比在域实体本身之间传递DTO(数据传输对象)更好

然后,在控制器中的编辑操作中,使用DTO提供的Id从存储库中检索对象,并更新属性,基本上就像上面建议的那样

e、 g


为了避免编写大量的“fromDB.X=item.X”代码,如果您根据一些简单的约定命名DTO属性,您应该查看哪些属性会映射到您的属性。

通常认为在控制器和视图之间传递DTO(数据传输对象)是更好的形式,而不是域实体本身

然后,在控制器中的编辑操作中,使用DTO提供的Id从存储库中检索对象,并更新属性,基本上就像上面建议的那样

e、 g


为了避免编写大量的“fromDB.X=item.X”代码,如果您根据一些简单的约定命名DTO属性,那么您应该看看哪些属性会映射到您的属性。

我同意在大多数情况下使用DTO比使用常规实体要好得多。您还可以接收每个属性作为操作的常规参数,但这会使您的操作签名变得混乱。DTO而不是域实体什么时候对我有利?因为在这种情况下我看不到。我之前的评论是一个真实的问题,而不是复述。我真的很想知道为什么“使用DTO更好”。对于非常简单的场景,您可以不使用实体。但最终您会发现,某些视图要求仅显示属性,而这些属性作为域实体的一部分毫无意义,或者您可能会发现域实体具有不想传递给视图的属性,尤其是当您具有嵌套属性时。因为我认为我当前的项目满足“简单场景”的要求,我将继续使用实体。不过,对于更大的项目,我会记住这一点。还有,我不知道AutoMapper,很有趣!我同意在大多数情况下,使用DTO比使用常规实体要好得多。您还可以接收每个属性作为操作的常规参数,但这会使您的操作签名变得混乱。DTO而不是域实体什么时候对我有利?因为在这种情况下我看不到。我之前的评论是一个真实的问题,而不是复述。我真的很想知道为什么“使用DTO更好”。对于非常简单的场景,您可以不使用实体。但最终您会发现,某些视图要求仅显示属性,而这些属性作为域实体的一部分毫无意义,或者您可能会发现域实体具有不想传递给视图的属性,尤其是当您具有嵌套属性时。因为我认为我当前的项目满足“简单场景”的要求,我将继续使用实体。不过,对于更大的项目,我会记住这一点。还有,我不知道AutoMapper,很有趣!从未见过UpdateModel()。这看起来确实是一个很好的方法!NHibernate将为我跟踪更改,因此我甚至不必调用.SaveChanges()。这可能正是我想要的。酷。正如您所知,实体框架也会跟踪更改,但您需要调用savechanges,这样它才能将这些更改提交到数据库never saw UpdateModel()。这看起来确实是一个很好的方法!NHibernate将为我跟踪更改,因此我甚至不必调用.SaveChanges()。这可能正是我想要的。酷。正如您所知,实体框架也跟踪更改,但您需要调用savechanges使其实际将这些更改提交到数据库
//get the original item from the DB
var fromDB = _itemDomainService.GetById(item.Id);

//update fromDB with values from the current "Item" that was posted
UpdateModel(fromDB);

//then save the changes that were made
_itemDomainService.SaveChanges();
//this last line is how it is done in Entity Framework - but I guess there is something similar in NHibernate
[HttpPost]
[Transaction]
public ViewResult Edit(ItemDTO item)
{
    // Validate here

    var fromDB = _itemDomainService.GetById(item.Id);
    fromDB.Name = item.Name;
    fromDB.Description = item.Description
    return Redirect("Item", "Details", item.Id);
}