首页 文章

这个Fluent NHibernate配置出了什么问题?

提问于
浏览
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())
            );
    }

2 回答

  • 6

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

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

    是你所追求的!将“ID”替换为您的实际 property .

  • 1

    例外情况是说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"
    )
    

相关问题