流畅的NHibernate持久性规范

时间:2009-11-20 21:55:08

标签: unit-testing fluent-nhibernate

我收到以下错误消息:

System.IndexOutOfRangeException:此SqlParameterCollection的索引9无效,Count = 9 ..

我绝对想知道为什么oO?!

使用FluentNHibernate正确创建了数据库模式和hbm.xml文件。 CanCorrectlyMapBook方法中出现错误,PersistenceSpecificationTest运行时没有错误。

[TestClass]
public class PersistenceSpecificationTests
{
    private static ISession _session;

    [TestInitialize]
    public void PersistenceSpecificationTest()
    {
        _session = Helper.CreateSessionFactory(false, false).OpenSession();
    }

    [TestMethod]
    public void CanCorrectlyMapBook()
    {
        new PersistenceSpecification<Book>(_session)
            .CheckProperty(p => p.IncludesCDDVD, true)
            .CheckProperty(p => p.Isbn, "1232324983sfdsdkfj")
            .CheckProperty(p => p.Name, "My Book")
            .VerifyTheMappings();
    }
}

数字9可能来自本书的列数。起初我以为我必须检查所有属性,但我在另一个项目中用另一个enity测试了它并且它正常工作。

有人有想法吗?

编辑:

这是我的域对象+映射:

    public interface IEntity
    {
        int Id { get; set; }
    }

    public abstract class LoanedItem : IEntity
    {
        public virtual int Id { get; set; }

        public virtual DateTime DateOfIssue { get; set; }

        public virtual bool IsLoaned { get; set; }

        public virtual String Name { get; set; }

        public virtual Employee LoanedBy { get; set; }

        public virtual Release Release { get; set; }

        public virtual Publisher Publisher { get; set; }

        public virtual bool IncludesCDDVD { get; set; }

    }

    public  class Book : LoanedItem
    {
        public virtual string Isbn { get; set; }

        public virtual int Author { get; set; }

    }

 public class BookMap : ClassMap<Book>
    {
        public BookMap()
        {
            // identity mapping
            Id(p => p.Id).Column("BookID");

            // column mapping
            Map(p => p.Author);
            Map(p => p.Isbn);
            Map(p => p.IncludesCDDVD);
            Map(p => p.IsLoaned);
            Map(p => p.Name);

            // component mapping
            // Publisher
            Component(p => p.Publisher, m =>
            {
                m.Map(x => x.Name);
                m.Map(x => x.Homepage);
            });

            // Release
            Component(p => p.Release, m =>
            {
                m.Map(x => x.ReleaseDate);
                m.Map(x => x.ReleaseNumber);
            });

            // reference/association 
            References(p => p.LoanedBy).Column("EmployeeID");
        }

编辑:

好的,上面的问题可以解决。

但我该如何检查组件?当我使用CheckProperty检查组件时发生错误...“预期'DomainModel.Model.Book'但得到'DomainModel.Model.Book'......呃:)那么错了吗?它是完全相同的域对象。我创建了一个新的question

2 个答案:

答案 0 :(得分:2)

问题可能是是名称属性。您有2个名为“Name”的属性 - 一个在Book中,一个在Publisher组件中。 AFAIR FluentNHibernate会将这些属性的两个映射到“NAME”列(检查生成的hbms),这会导致您收到错误。

尝试为其中一个属性指定不同的列名(最好在Publisher组件中添加一个前缀左右),看看这是否有帮助。

答案 1 :(得分:0)

我刚刚在一个新项目中尝试了您的代码,将POCO和映射简化为您在测试类中测试的内容。这就是我所拥有的:

public abstract class LoanedItem
{
    public virtual int Id { get; set; }
    public virtual String Name { get; set; }
    public virtual bool IncludesCDDVD { get; set; }
}

public class Book : LoanedItem
{
    public virtual string Isbn { get; set; }
}

public class BookMap : ClassMap<Book>
{

public BookMap()
{
    // identity mapping
    Id(p => p.Id).Column("BookID");

    // column mapping
    Map(p => p.Isbn);
    Map(p => p.IncludesCDDVD);
    Map(p => p.Name);
}

测试跑步者:

[TestClass]
public class PersistenceSpecificationTests
{
    private static ISession _session;

    [TestInitialize]
    public void PersistenceSpecificationTest()
    {
        var cfg = Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.InMemory().UseReflectionOptimizer())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Book>())
            .BuildConfiguration();

        _session = cfg.BuildSessionFactory().OpenSession();
        new SchemaExport(cfg).Execute(false, true, false, _session.Connection, null);
    }

    [TestMethod]
    public void CanCorrectlyMapBook()
    {
        new PersistenceSpecification<Book>(_session)
            .CheckProperty(p => p.IncludesCDDVD, true)
            .CheckProperty(p => p.Isbn, "1232324983sfdsdkfj")
            .CheckProperty(p => p.Name, "My Book")
            .VerifyTheMappings();
    }
}

它使用的是内存中的SQLite数据库。测试通过正常,所以问题必须在其他地方。