我收到以下错误消息:
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
答案 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数据库。测试通过正常,所以问题必须在其他地方。