0

我想测试我的实体是否可以持久化到数据库中,所以我看到了这篇文章:

http://www.codethinked.com/nhibernate-20-sqlite-and-in-memory-databases

我初始化会话工厂的代码与文章中的代码相同:

public class NHibernateInMemoryTestFixtureBase
{
    protected static ISessionFactory sessionFactory;
    protected static Configuration configuration;

    public static void InitalizeSessionFactory(params Assembly[] assemblies)
    {
        if (sessionFactory != null)
            return;

        var properties = new Dictionary<string, string>();
        properties.Add("connection.driver_class", "NHibernate.Driver.SQLite20Driver");
        properties.Add("dialect", "NHibernate.Dialect.SQLiteDialect");
        properties.Add("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
        properties.Add("connection.connection_string", "Data Source=:memory:;Version=3;New=True;");
        properties.Add("connection.release_mode", "on_close");

        configuration = new Configuration();
        configuration.Properties = properties;

        foreach (Assembly assembly in assemblies)
        {
            configuration = configuration.AddAssembly(assembly);
        }
        sessionFactory = configuration.BuildSessionFactory();
    }

    public ISession CreateSession()
    {
        ISession openSession = sessionFactory.OpenSession();
        IDbConnection connection = openSession.Connection;
        new SchemaExport(configuration).Execute(false, true, false, true, connection, null);
        return openSession;
    }
}

这是我的测试:

[Test]
public void IWillChangeThisNameLater()
{
    InitalizeSessionFactory(typeof(LogRepository).Assembly);

    var session = this.CreateSession();

    Log log = Log.New("a", "b", "I");

    session.Save(log);
    session.Flush();

    Assert.Greater(log.IDColumn, 0);
}

问题是,我从 log.hbm.xml 中删除了 Log 的“a”属性,并且 session.Save(log) 没有抛出异常或任何东西,它只是工作......

这一定很明显而且很简单,但我不知道为什么会这样,如果没有映射它怎么能保存它,内存数据库是这样工作的吗?那我该如何测试我的映射呢?

我主要做了这个内存测试,以便我可以立即知道有效实体是否无法持久化,当然这将包括映射文件中缺少的属性。

任何想法将不胜感激。


编辑:

按照要求,

日志实体定义:

public class Log : DomainBase<Log, ILogRepository<Log>>
{
    private int logId;
    private string tableName;
    private string field;
    private string userLogin;

    protected Log()
    {
    }

    protected Log(string tableName, string field, string userLogin)
    {
        TableName = tableName;
        Field = field;
        UserLogin = userLogin;
    }

    public virtual int LogId { get; set; }
    public virtual string TableName { get; set; }
    public virtual string Field { get; set; }
    public virtual string UserLogin { get; set; }
}

日志映射:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="DomainProject" table="Log" lazy="true">
    <id name="logId" column="ID" type="int">
      <generator class="native" />
    </id>
    <property name="TableName" column="TableName" type="string" />
    <property name="Field" column="Field" type="string" />
    <property name="UserLogin" column="UserLogin" type="string" />
  </class>
</hibernate-mapping>
4

1 回答 1

0

如果一个类包含映射中未提及的属性,NHibernate 将忽略该属性。

于 2013-01-18T12:31:57.603 回答