2009-11-20 77 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數據庫。測試通過很好,所以問題必須在其他地方。