我对Hibernate很新.我发现我们可以使用以下两种不同的方式获得不同的结果.谁能告诉我他们之间有什么区别?何时使用其他?
Projections.distinct(Projections.property("id"));
Run Code Online (Sandbox Code Playgroud)
VS
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud) 我有NHibernate的以下配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.connection_string">Server=.\SQLEXPRESS;Database=mydb;Integrated Security=True;</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.release_mode">auto</property>
<property name="adonet.batch_size">500</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
但SQL不会显示在Visual Studio的输出窗口中.是否必须安装log4net?或者应该show_sql独自工作?
什么是Projection,在数据库理论和NHibernate方面使用SetProjection()?
我一直在为nhibernate寻找好的文档,特别是2.0版本.我最近回到了.NET开发阶段,在我的生活中,我找不到合适的文档(甚至是最新的文档).任何建议将不胜感激.
nhibernate HasOne()和References()nhibernate 之间有什么区别?
持久性无知通常被定义为持久化和检索标准.NET对象的能力(如果您真的坚持给它们命名,则为POCO).一个看似公认的标准.NET对象定义是:
"...普通的课程,你专注于手头的业务问题而不添加与基础设施相关的原因......"
但是,我看到人们将NHibernate描述为一个允许持久性无知的框架,但它是一个不能在任何标准.NET对象上工作的框架,只有符合特定设计要求的标准.NET对象,例如(源代码):
(旁白:在任何人不高兴之前,我并不打算在这里选择NHibernate,它只是一个经常被引用的框架示例,据说允许持久性无知.我敢肯定类似的论点可以应用于其他声称相同的ORM .)
现在虽然这个类本身没有任何持久性特定于框架的属性或基类等,但对我而言,它实际上并不是"持久性无知",因为它必须遵循一套设计指南以便于所选持久性框架的使用.您必须考虑到持久性框架的要求来设计和实现该类; 如果你不了解它,那么这个班可能无法使用它.
当我在与"持久性无知" /"POCO"的定义问题是,我不知道怎么样,从概念上讲,这是真的有什么不同,以添加属性,如[Serializable]或[DataContract]或[XmlType]或任何其他持久性框架,具体的注解这有利于使用该框架的实体的持久性和检索.
那么,"持久性无知"到底是什么?
很明显,将它定义为能够持久化"普通类"是一种谬误,因为NHibernate只是在没有引用特定于框架的类的情况下是普通的,而它们非常特殊,因为它们需要不寻常的设计选择,例如默认构造函数和所有类-virtual成员和可变类型的Equals/GetHashCode实现.
因此,当对象促进使用持久性框架(在设计和结构中或通过使用特定于框架的注释)但不执行任何持久性逻辑时,"持久性无知"是否合理?
我不是NHibernate用户; 我写了一个序列化实用程序库.用户已记录一个功能请求,我应该处理NHibernate代理类,将它们视为与实际类型相同.目前,我的代码将它们视为意外继承,并抛出异常.
代码不会提前知道NHibernate(包括没有引用,但我不是反射;-p)
是否有一种强大/可靠的方法来检测此类代理类型?显然DataContractSerializer处理这个很好,所以我希望它是非常简单的.也许是一些界面或[attribute]装饰.
此外,在反序列化期间; 目前我将创建原始类型(不是NHibernate类型).这是否适用于持久性目的?或者是否需要代理类型?如果是后者; 创建代理类型的实例需要什么?
我在手动调试.NET应用程序时遇到困难,其中Guid值从.NET到Oracle不同.
17D89D326C2142D69B989F5201288DBF329DD817216CD6429B989F5201288DBF我怎么能够手动调试,即从C#的GUID能够将该值粘贴到oracle查询中并获得正确的结果(反之亦然)?
我有兴趣听取别人的意见,看看他们会选择哪一个(没有'neithers' please;),以及为什么.
使用流利的缺点是什么?(版本依赖可能?)优点,缺点,经验等
我有一个应用程序,我使用Fluent Nhibernate来创建我的数据库.到目前为止,我每次都在重新创建数据库模式.执行此操作的代码是:
public NhibernateSessionFactory(IPersistenceConfigurer config)
{
_sessionFactory = Fluently.Configure().
Database(config).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
ExposeConfiguration(BuildSchema).
BuildSessionFactory();
}
private static void BuildSchema(Configuration config)
{
// if (DbExists(config))
// return;
new SchemaExport(config).Create(false, true);
}
Run Code Online (Sandbox Code Playgroud)
注意" if (DbExists(config))".这就是我想做的.我只想在它实际上不存在的情况下创建模式.在下一步 - 如果它不是最新的,我想更新它.
我该如何实现这一目标?我期待一个config.DatabaseExists(),但我看不到这样的事情.我看到了hacky解决方案的一些可能性,但是处理这个问题的典型推荐方法是什么?