2

以下设置有什么问题?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())
            );
    }
4

2 回答 2

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"
)
于 2009-03-31T09:10:58.800 回答
1

詹姆斯正确地引导你,但他的片段是错误的。

.WithSetup(s=> s.FindIdentity = p => p.Name == "ID"));

是你所追求的!将“ID”替换为您的实际财产。

于 2009-04-29T01:14:25.177 回答