我问了一个类似的问题,但我仍然怀疑该怎么做,所以我想用更多的信息来提问这个问题:
比如说我有以下Object
:
public class Callback : SuperObject
{
public virtual DateTime PERIOD { get; set; }
public virtual int COMPLETED { get; set; }
public virtual int COMPLETED_WITHIN_2HOURS { get; set; }
}
现在if if我添加一个包含映射信息的XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Henvendelser" namespace="Henvendelser.Objects.Callback">
<class name="Henvendelser.Objects.Callback">
<id name="PERIOD" column="PERIOD">
<generator class="identity" />
</id>
<property name="COMPLETED" />
<property name="COMPLETED_WITHIN_2HOURS" />
</class>
</hibernate-mapping>
然后以下内容将完全正常运行:
var query = new StringBuilder();
query.Append("SELECT LAST_UPD AS PERIOD, ");
query.Append("COUNT(CASE WHEN STATUS ='Færdig' THEN 1 END) as completed, ");
query.Append("COUNT(CASE WHEN SOLVED_SECONDS /60 /60 <= 2 THEN 1 END) as completed_within_2hours ");
query.Append("FROM KS_DRIFT.NYK_SIEBEL_CALLBACK_AGENT_H_V ");
query.Append("WHERE LAST_UPD BETWEEN '" + start.ToString("yyyy-MM-dd") + "' AND '" + end.ToString("yyyy-MM-dd") + "' ");
query.Append("AND STATUS ='Færdig' ");
query.Append("GROUP BY LAST_UPD ORDER BY LAST_UPD ASC");
var session = sessionFactory.OpenSession();
var result = session.CreateSQLQuery(query.ToString()).AddEntity(typeof(Callback)).List<Callback>();
但是在一个更大的程序中哪个很棒我可能有10个或更多不同的objects
,这意味着在这种情况下我将需要制作10个映射对象的xml文件。现在在我的逻辑中mapping xml
基本上说object
类已经看起来如此,所以看起来有点多余!
有更好的方法吗?
答案 0 :(得分:1)
为避免必须为每个类定义映射,您可以Fluent NHibernate
使用automapping
Fluent NHibernate有一个名为Auto Mapping的概念,它是一种根据一组约定自动映射所有实体的机制。
自动映射利用约定优于配置的原则。使用此原则,自动映射器检查您的实体并对特定属性应该是什么进行假设。也许您有一个名称为Id且类型为int的属性,自动映射将决定这是一个自动递增的主键。
通过使用自动映射,您可以使用非常少的代码映射整个域,当然也不需要XML。仍然存在可能不适合使用自动映射的情况,此时使用Fluent映射更合适;然而,对于大多数绿地应用(以及相当多的棕地应用),自动映射将更有能力。
正如其他用户指出的那样,使用ORM并创建普通的sql查询来加载数据是没有意义的。您可能需要在极端情况下执行此操作,但它不是规则,否则根本不使用NHibernate。
我建议您开始查看如何使用NHibernate的基本知识。
答案 1 :(得分:0)