以下设置有什么问题? AutoPersistanceModel上的Where过滤器似乎不起作用,并且表名约定似乎也不起作用。我经常得到的错误是“命名空间'urn:nhibernate-mapping-2.2'中的元素'class'在命名空间'urn:nhibernate-mapping-2.2'中有无效的子元素'property'。预期的可能元素列表:命名空间'urn:nhibernate-mapping-2.2'中的'meta,jcs-cache,cache,id,composite-id'。“这是我的代码:
public ISessionFactory BuildSessionFactory()
{
return Fluently.Configure()
.Database(
OracleConfiguration.Oracle9.ConnectionString(
c => c.FromConnectionStringWithKey("ConnectionString")))
.Mappings(m =>
{
m.AutoMappings.Add(GetAutoPersistanceModel);
m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
})
.BuildSessionFactory();
}
public AutoPersistenceModel GetAutoPersistanceModel()
{
return AutoPersistenceModel.MapEntitiesFromAssemblyOf<User>()
.Where(type => type.IsClass && !type.IsAbstract && type.Namespace == "Some.Namespace")
.ConventionDiscovery.Add<IConvention>(
Table.Is(x => "tbl" + x.EntityType.Name.Pluralize())
);
}
答案 0 :(得分:6)
异常是说NHibernate首先遇到<property />
元素,这是无效的。 NHibernate hbm文件中的第一个元素应该(几乎)始终是Id,因此AutoPersistenceModel
似乎找不到您的标识符。
您的实体中如何命名您的ID? AutoPersistenceModel
期望它们字面上被称为 Id ,如果它们有任何不同,那么它就找不到它们。
您可以使用FindIdentity
配置选项覆盖AutoPersistenceModel
查找ID的方式,如果您无法修改实体,这可能很有用。
// if your Id is EntityId
.WithSetup(s =>
s.FindIdentity = property => property.DeclaredType.Name + "Id"
)
答案 1 :(得分:1)
詹姆斯正确地引导你,但他的片段是错误的。
.WithSetup(s=> s.FindIdentity = p => p.Name == "ID"));
你是在追求什么!将“ID”替换为您的实际财产。