昨晚终于成功编译了 NHibernate 的 Examples, 不过马上又遇到新问题 ...
前几天看了不少的关于 NHibernate / ORM 的文章,但是结果还是觉得糊里糊涂,对 NHibernate 的使用还是不太了解,经过寻思后,觉得是由于自己没有切实地体验 NHibernate 是怎么工作的, 于是决定看一看 NHibernate 自带的 Examples,打开后看了几眼,便决定要编译一下看看运行结果如何,可是我居然遇到问题了,编译竟然不通过,老是报错 "... NHibernate.snk 文件不存在或无法访问"。我在项目中搜索了 “NHibernate.snk”,发现一个配置文件里边果然有一行写着 <property value="..\NHibernate.snk" name="keyFile"></property>,于是搜索了整个 NHibernate 文件夹,结果没有发现这一文件。于是我只好向 Baidu 和 Google 求助了,搜索关键字“NHibernate.snk”,发现果然有不少人和我一样遇到这个问题了,同时我也找到了答案,原来这个 snk 文件是要自己用 VS.NET 的 sn 工具生成的。在 NHibernate 的官方论坛里我看到了这么一条指令 sn -k NHibernate.snk ,我猜这就是用来生成 NHibernate.snk 文件的吧,于是打开 cmd 输入上边的指令,果然在运行目录下生成了这个文件,将它复制到NHibernate目录的 src 目录和 src/NHibernate/obj 目录下,然后编译,耶!成功了!蛙蝦蝦。。。
不过呢,好事多磨,我的学习过程似乎总是一路坎坷,问题是一个解决完一个又出现。我将 NHibernate.Examples-1.1 项目的输出类型转换成控制台程序,并在其中新建了一个 Examples 类,在其中测试 UserFixture 等类。代码如下:
编译后运行发现,第一次运行是ok的,再运行一次就出错了。报错如下:could not synchronize database state with session,我想应该是因为 LoginId 是个主键的原因吧,但是这种错误该怎么避免呢,用 try-catch 吗?那么怎么才能知道出错的原因是主键冲突呢?我看上边的报错信息似乎不是这个意思啊。
不过呢,好事多磨,我的学习过程似乎总是一路坎坷,问题是一个解决完一个又出现。我将 NHibernate.Examples-1.1 项目的输出类型转换成控制台程序,并在其中新建了一个 Examples 类,在其中测试 UserFixture 等类。代码如下:
using System;
using NHibernate.Examples.QuickStart;
namespace NHibernate.Examples
{
/// <summary>
/// Examples 的摘要说明。
/// </summary>
public class Examples
{
public Examples()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void Main(string[] args)
{
try
{
UserFixture userFixture = new UserFixture();
userFixture.ValidateQuickStart();
Console.WriteLine("It runs successfully.");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
using NHibernate.Examples.QuickStart;
namespace NHibernate.Examples
{
/// <summary>
/// Examples 的摘要说明。
/// </summary>
public class Examples
{
public Examples()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void Main(string[] args)
{
try
{
UserFixture userFixture = new UserFixture();
userFixture.ValidateQuickStart();
Console.WriteLine("It runs successfully.");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
编译后运行发现,第一次运行是ok的,再运行一次就出错了。报错如下:could not synchronize database state with session,我想应该是因为 LoginId 是个主键的原因吧,但是这种错误该怎么避免呢,用 try-catch 吗?那么怎么才能知道出错的原因是主键冲突呢?我看上边的报错信息似乎不是这个意思啊。