使用nHibernate实体和DTO发送网格数据

时间:2010-08-19 06:01:30

标签: c# nhibernate nhibernate-mapping dto

我们在域模型中使用nHibernate,并且希望创建DTO以通过WCF将对象发送到使用MVVM模式(WPF / WinForms)创建的前端应用程序。我们完全控制客户端和服务器 - 两者都同时升级,因此版本控制/跨平台不是问题。

我看到如何编辑单个条目,但是我仍然不确定通过网络发送对象集合的最佳方法。然后,DTO用于填充网格,其中可以更新,删除或添加行。

我的问题是;使用DTO和nHibernate在网格/表格场景中捕获插入,更新和删除的最佳方法是什么?

谢谢。

(我们的应用程序最初使用DataTables,其中DataTable / DataRow跟踪修改并使用GetChanges / Merge,您可以通过线路传输仅修改和需要更新的内容 - 其中插入和删除也很好地跟踪)< / p>

2 个答案:

答案 0 :(得分:1)

我很可能会发送一个容器类,其中包含新的和更新的实例以及要删除的项目。

例如:

class GridModificationsDto
{
  Dto[] NewOrUpdatedItems { get; set; }
  Identity[] DeletedItems { get; set; }
}

当一个项目是新的时,它没有id。您还可以为新项目单独列出。

然后你需要做这样的事情:

foreach(Dto dto in modifications.NewOrUpdatedItems)
{
  if (dto.id == 0)
  {
    session.Save(DtoMapper.CreateEntity(dto));
  }
  else
  {
    Entity entity = session.Get<Entity>(dto.id);
    DtoMapper.Update(entity, dto);
  }
}

foreach(Identity identity in modifications.DeletedItems)
{
  session.Delete<Entity>(identity.id);
}

我不知道如何获取ui中的修改项目列表。我认为这可以通过数据绑定和PropertyChanged事件以及类似的东西来获得。如果没有任何有用的东西,您可能需要继承自己的Grid控件。

答案 1 :(得分:0)

您需要绑定到BindingSource,例如:

dataGridView1.DataSource = _presenter.BindingSource;

您的View和Presenter之间也会有某种界面。

在您的演示者中,您将返回IList<NHibernateResult>,其中NHibernateResult是您所有要获取的属性的所有getter和setter的类。它可以是具有有限属性的自定义类(例如列)或您的实体类。 NHibernateResult不是一个实际的类,只是这个答案的占位符。

例如(在演示者中),

private IList<OrdersResult> _bindingSource;

        public IList<OrdersResult> BindingSource
        {
            get
            {
                //_bindingSource = OrderDataControl.Instance.GetAll();
                _bindingSource = 
                    OrderDataControl.Instance.GetSimpleOrderList(_firstResult, _maxResult);
                return _bindingSource;
            }

            set
            {
                _bindingSource = value;
            }
        }

OrderDataControl是数据访问对象或数据传输对象。它与您的SessionProvider和Respository(aka Model)交互。

这种抽象级别会从您的演示者中删除数据层,并使您的视图完全对模型完全愚蠢。它将您的视图降级为仅与UI相关的事件,例如Enabled,Visible,Colors等。