什么是Hi/Lo算法?
我在NHibernate文档中找到了这个(它是生成唯一键的一种方法,第5.1.4.2节),但我没有找到它如何工作的很好的解释.
我知道Nhibernate处理它,我不需要知道内部,但我只是好奇.
任何人都可以用简单的话来解释Hibernate中的第一级和第二级缓存是什么?
令我彻底混淆的一件事是使用session.Flush
,和session.Commit
,和session.Close
.
有时session.Close
工作,例如,它提交我需要的所有更改.我知道我需要在有事务时使用提交,或者需要在具有多个创建/更新/删除的工作单元中使用提交,以便我可以选择在发生错误时回滚.
但有时我真的被后面的逻辑所困扰session.Flush
.我已经看到了一些示例,其中有一个session.SaveOrUpdate()
后续的同花顺,但是当我删除Flush时它无论如何都能正常工作.有时我在Flush语句中遇到错误,说会话超时,并删除它确保我没有遇到该错误.
有没有人有关于何时何地使用同花顺的良好指导方针?我已经检查了NHibernate文档,但我仍然找不到简单的答案.
现在,在你说之前:我做了 Google,我的hbm.xml
文件是嵌入式资源.
这是我要调用的代码:
ISession session = GetCurrentSession();
var returnObject = session.Get<T>(Id);
Run Code Online (Sandbox Code Playgroud)
这是我的类的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="HQData.Objects.SubCategory, HQData" table="SubCategory" lazy="true">
<id name="ID" column="ID" unsaved-value="0">
<generator class="identity" />
</id>
<property name="Name" column="Name" />
<property name="NumberOfBuckets" column="NumberOfBuckets" />
<property name="SearchCriteriaOne" column="SearchCriteriaOne" />
<bag name="_Businesses" cascade="all">
<key column="SubCategoryId"/>
<one-to-many
class="HQData.Objects.Business, HQData"/>
</bag>
<bag name="_Buckets" cascade="all">
<key column="SubCategoryId"/>
<one-to-many
class="HQData.Objects.Bucket, HQData"/>
</bag>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个问题?
这是完整的错误消息:
MappingException: No persister for: HQData.Objects.SubCategory]NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, Boolean throwIfNotFound) in c:\CSharp\NH2.0.0\nhibernate\src\NHibernate\Impl\SessionFactoryImpl.cs:766 …
作为一个没有在现实世界项目中使用这两种技术的人,我想知道是否有人知道这两者如何相互补充以及它们的功能重叠多少?
很多人已经在网上讨论过Entity Framework的第一个版本(也在stackoverflow上),很明显,当我们已经拥有像NHibernate这样的更好的替代品时,它不是一个好的选择.但我找不到实体框架4和NHibernate的良好比较.我们可以说今天NHibernate是所有.NET ORM中的领导者,但是我们可以期待Entity Framework 4从这个位置取代NHibernate.我认为如果微软真的在EF4中注入了非常好的功能,它可以给NHibernate带来很好的竞争,因为它具有Visual Studio集成,更易于使用,并且在大多数商店中总是优先考虑MS产品.
不知道如何解决这个问题,尝试对方法"GetByTitle"进行单元测试
以下是我的定义:
public class ArticleDAO : GenericNHibernateDAO(IArticle, int>, IArticleDAO
{
public IArticle GetByTitle(string title)
{
IQuery query = Session.CreateQuery("...")
return query.UniqueResult<IArticle>();
}
}
public interface IArticleDAO
{
IArticle GetByTitle(string title);
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
[Test]
public void can_load_by_title()
{
_mockDaoFactory.Setup(x => x.GetArticleDao())
.Returns(_mockArticleDao.Object);
_mockArticleDao.Setup(x => x.GetByTitle("some title"))
.Returns(article1.Object);
_articleManager.LoadArticle("some title");
Assert.IsNotNull(_articleManager.Article);
}
Run Code Online (Sandbox Code Playgroud)
运行测试给出了错误:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetByTitle("some title")
Run Code Online (Sandbox Code Playgroud)
更新
我[Setup]
看起来像:
[Setup]
public void SetUp()
{
_mockDaoFactory = new Mock<IDaoFactory>();
_mockArticleDao = new Mock<ArticleDao>();
_articleManager …
Run Code Online (Sandbox Code Playgroud) 例如,我想在ASP.NET网页中填充gridview控件,只显示显示的行数所需的数据.NHibernate如何支持这个?
NHibernate映射文件中的列表,集合和包之间有什么区别?每个如何与.NET集合相关?
在我的学徒期间,我已经将NHibernate用于一些较小的项目,我自己编写和设计.现在,在开始一个更大的项目之前,讨论产生了如何设计数据访问以及是否使用ORM层.由于我仍处于学徒阶段,并且仍然认为自己是企业编程的初学者,我并没有真正尝试推动我的观点,即使用对象关系映射器到数据库可以大大简化开发.开发团队中的其他程序员比我经验丰富,所以我想我会按照他们的说法去做.:-)
但是,我不完全理解不使用NHibernate或类似项目的两个主要原因:
所以,当然我可以用很多SELECT
s等构建我的数据访问层,但是在这里我会错过自动连接,延迟加载代理类的优势以及如果表获得新列或列获得更低的维护工作量重命名.(更新众多SELECT
,INSERT
并且UPDATE
查询与更新映射配置,并可能重构业务类和DTO的.)
此外,如果您不熟悉框架,使用NHibernate可能会遇到无法预料的问题.例如,这可能是信任Table.hbm.xml,您可以在其中设置字符串的长度以自动验证.但是,我也可以想象一下基于"简单"SqlConnection查询的数据访问层中的类似错误.
最后,上面提到的那些论点真的是不利用ORM用于基于数据库的非平凡企业应用程序的理由吗?他/我可能错过了其他可能的争论吗?
(我应该补充一点,我认为这就像第一个基于.NET/C#的"大型"应用程序需要团队合作.在Stack Overflow上被认为非常正常的良好实践,例如单元测试或持续集成,都是非 - 到现在为止.)
nhibernate ×10
.net ×4
orm ×4
c# ×3
hibernate ×2
algorithm ×1
database ×1
enterprise ×1
flush ×1
hilo ×1
linq ×1
linq-to-sql ×1
moq ×1
nunit ×1
pagination ×1
resharper ×1
session ×1