2009-11-20 81 views
0

,我得到了以下错误消息:功能NHibernate PersistenceSpecification

System.IndexOutOfRangeException:无效指数9这SqlParameterCollection以计数= 9 ..

而且我绝对不知道为什么OO?

数据库模式和hbm.xml文件都是用FluentNHibernate正确创建的。 在CanCorrectlyMapBookmethod错误ocurrs的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可能来自本书的列数。起初我以为我必须检查所有的属性,但我在另一个项目中测试了另一个项目并且它正常工作。

任何人有想法?

编辑:

这里我的域对象+绘制:

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

+0

您可以发布图书映射? – maciejkow 2009-11-20 21:59:41

+0

是的,请提供您的图书映射和图书实体。另一方面,这就是为什么我不使用PersistenceSpecification。出现问题时,您不能“打破”打开并调试它。我更喜欢编写一个保存和加载类,使用NBuilder生成一个实体,并保存/加载它以确认它已被保存。通过这种方式,您可以设置断点并检查局部变量,以查看它们在任何给定点上的值。 – 2009-11-20 22:17:56

回答

2

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

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

+0

非常感谢你这是正确的答案:)但我问自己,为什么流利NHibernate没有警告我? – Rookian 2009-11-21 10:24:35

0

我只是想你的代码在一个新的项目,简化了波苏斯和映射到只有你在你的测试类测试什么这是我有:

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数据库。测试通过很好,所以问题必须在其他地方。