nhibernate和DDD建议

nhibernate和DDD建议,nhibernate,domain-driven-design,Nhibernate,Domain Driven Design,我是nHibernate和DDD的新手,所以请容忍我 我需要从我的SQL表创建一个新报告。该报表是只读的,将绑定到ASP.NET应用程序中的GridView控件 报告包含以下字段:样式、颜色、大小、LAQty、MTLQty、状态 我有样式、颜色和大小的实体,我在其他asp.net页面中使用这些实体。我通过存储库使用它们。我不确定我的报告是否应该使用相同的实体。如果我使用它们,我应该在哪里映射数量和状态字段 如果我不应该使用相同的实体,我应该为报表创建一个新类吗 正如我所说的,我对这一点还不熟悉,

我是nHibernate和DDD的新手,所以请容忍我

我需要从我的SQL表创建一个新报告。该报表是只读的,将绑定到ASP.NET应用程序中的GridView控件

报告包含以下字段:样式、颜色、大小、LAQty、MTLQty、状态

我有样式、颜色和大小的实体,我在其他asp.net页面中使用这些实体。我通过存储库使用它们。我不确定我的报告是否应该使用相同的实体。如果我使用它们,我应该在哪里映射数量和状态字段

如果我不应该使用相同的实体,我应该为报表创建一个新类吗

正如我所说的,我对这一点还不熟悉,只是在尝试正确地学习和编码


感谢您提供的报告通常更易于使用普通值或特殊DTO。当然,您可以查询引用所有信息的实体,但要将其放入列表(例如,使用数据绑定),更方便的做法是使用一个包含所有值的类

要获得以下几个更具体的解决方案,您需要告诉我们一些关于您的域模型的信息。类模型是什么样子的

通常,您至少有三个选项可以使用NHibernate从数据库中获取“普通”值

写入返回值数组的HQL

例如:

select e1.Style, e1.Color, e1.Size, e2.LAQty, e2.MTLQty 
from entity1 inner join entity2
where (some condition)
结果将是对象[]的列表。列表中的每个项目都是一行,对象[]中的每个项目都是一列。这很像sql,但在更高的级别上(您在实体级别上描述查询),并且与数据库无关

或者您创建一个DTO(数据传输对象)仅用于保存结果的一行:

select new ReportDto(e1.Style, e1.Color, e1.Size, e2.LAQty, e2.MTLQty)
from entity1 inner join entity2
where (some condition)
ReportDto需要实现具有所有这些参数的构造函数。结果是一个ReportDto列表

或使用CriteriaAPI(推荐)

session.CreateCriteria(typeof(Entity1),“e1”)
.CreateCriteria(类型(Entity2),“e2”)
.添加(/*某些条件*/)
.Add(projects.Property(“e1.Style”、“Style”))
.Add(projects.Property(“e1.Color”、“Color”))
.Add(projects.Property(“e1.Size”、“Size”))
.Add(projects.Property(“e2.LAQty”、“LAQty”))
.Add(projects.Property(“e2.MTLQty”、“MTLQty”))
.SetResultTransformer(别名为Bean(类型为(ReportDto)))
.List();

ReportDto需要有一个带有每个别名“Style”、“Color”等名称的项目。输出是ReportDto的列表。

对于报告,通常更容易使用普通值或特殊DTO。当然,您可以查询引用所有信息的实体,但要将其放入列表(例如,使用数据绑定),更方便的做法是使用一个包含所有值的类

要获得以下几个更具体的解决方案,您需要告诉我们一些关于您的域模型的信息。类模型是什么样子的

通常,您至少有三个选项可以使用NHibernate从数据库中获取“普通”值

写入返回值数组的HQL

例如:

select e1.Style, e1.Color, e1.Size, e2.LAQty, e2.MTLQty 
from entity1 inner join entity2
where (some condition)
结果将是对象[]的列表。列表中的每个项目都是一行,对象[]中的每个项目都是一列。这很像sql,但在更高的级别上(您在实体级别上描述查询),并且与数据库无关

或者您创建一个DTO(数据传输对象)仅用于保存结果的一行:

select new ReportDto(e1.Style, e1.Color, e1.Size, e2.LAQty, e2.MTLQty)
from entity1 inner join entity2
where (some condition)
ReportDto需要实现具有所有这些参数的构造函数。结果是一个ReportDto列表

或使用CriteriaAPI(推荐)

session.CreateCriteria(typeof(Entity1),“e1”)
.CreateCriteria(类型(Entity2),“e2”)
.添加(/*某些条件*/)
.Add(projects.Property(“e1.Style”、“Style”))
.Add(projects.Property(“e1.Color”、“Color”))
.Add(projects.Property(“e1.Size”、“Size”))
.Add(projects.Property(“e2.LAQty”、“LAQty”))
.Add(projects.Property(“e2.MTLQty”、“MTLQty”))
.SetResultTransformer(别名为Bean(类型为(ReportDto)))
.List();

ReportDto需要有一个包含每个别名“Style”、“Color”等名称的项目。输出是ReportDto的列表。

我并没有接受过DDD的严格教育,但我总是将我的名词建模为类型,我很惊讶报告本身是一个实体。不管是否使用DDD,我都不会这样做,而是让我的报告反映查询结果,其中数量大概是count(*)或sum(lineItem.quantity),状态也会被计算(可能在页面中)

您还没有描述您的域,但是在这些列标题上有一个线索,您可能正在对数据进行透视以创建LAQty、MTLQty,您会发现在nHibernate中很难做到这一点,因为它是为OLTP设计的,甚至在我上次检查时没有实现UNION。也就是说,滥用HQL(Hibernate查询语言)进行轻量级报告并没有什么错,只要您知道自己在滥用它


我看到Stefan在描述语法方面做了大量的工作,所以我就到此为止:-)

我并没有完全学习DDD,但我总是将我的名词建模为类型,我很惊讶报告本身是一个实体。不管是否使用DDD,我都不会这样做,而是让我的报告反映查询结果,其中数量大概是count(*)或sum(lineItem.quantity),状态也会被计算(可能在页面中)

您还没有描述您的域,但是在这些列标题上有一个线索,您可能正在对数据进行透视以创建LAQty、MTLQty,您会发现在nHibernate中很难做到这一点,因为它是为OLTP设计的,甚至在我上次检查时没有实现UNION。也就是说,滥用HQL(Hibernate查询语言)进行轻量级报告并没有什么错,只要您知道自己在滥用它


我看到Stefan在描述语法方面做了大量工作,所以我就到此为止:-)

这听起来像个愚蠢的问题,但你知道我在做什么