Нельзя использовать объединенный подкласс сопоставления xml для расширения сборки сопоставлений с помощью NHibernate.Mapping.ByCode - PullRequest
0 голосов
/ 18 января 2020

Я изменяю отображение NHibernate.AspNetCore.Identity до NHibernate.Mapping.ByCode, как описано в выпуске https://github.com/nhibernate/NHibernate.AspNetCore.Identity/issues/16.

Я переписал orignal xml отображение NHibernate.AspNetCore.Identity с ClassMapping<T>, код выглядит следующим образом:

public class IdentityRoleMappingPostgreSql : ClassMapping<IdentityRole> {

    public IdentityRoleMappingPostgreSql() {
        Schema("public");
        Table("aspnet_roles");
        Id(e => e.Id, id => {
            id.Column("id");
            id.Type(NHibernateUtil.String);
            id.Length(32);
            id.Generator(Generators.TriggerIdentity);
        });
        Property(e => e.Name, prop => {
            prop.Column("name");
            prop.Type(NHibernateUtil.String);
            prop.Length(64);
            prop.NotNullable(true);
            prop.Unique(true);
        });
        /* other property mappings ignored here .*/
    }

}

Полный код отображения здесь:

https://github.com/nhibernate/NHibernate.AspNetCore.Identity/tree/master/src/NHibernate.AspNetCore.Identity/Entities

Затем я пытаюсь расширить эти сопоставления с помощью joined-sublcass из xml сопоставлений, например:

<?xml version="1.0" encoding="UTF-8" ?>
<hibernate-mapping
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="urn:nhibernate-mapping-2.2"
  namespace="WebTest.Entities" assembly="WebTest">

  <joined-subclass name="AppRole" schema="public" table="app_roles" extends="NHibernate.AspNetCore.Identity.IdentityRole, NHibernate.AspNetCore.Identity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    <key column="id" />
    <property name="Description" column="description" type="string" length="256" />
  </joined-subclass>

</hibernate-mapping>

При установке nhibernate я получил следующее исключение:

NHibernate.MappingException : These classes referenced by 'extends' were not found:
FullName:NHibernate.AspNetCore.Identity.IdentityRole - Name:NHibernate.AspNetCore.Identity.IdentityRole, NHibernate.AspNetCore.Identity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
FullName:NHibernate.AspNetCore.Identity.IdentityUser - Name:NHibernate.AspNetCore.Identity.IdentityUser, NHibernate.AspNetCore.Identity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   at NHibernate.Cfg.MappingsQueue.CheckNoUnavailableEntries()
   at NHibernate.Cfg.Configuration.SecondPassCompile()
   at NHibernate.Cfg.Configuration.BuildMappings()
   at UnitTest.IdentityTest._02_CanSetupMappingByXml()

Затем я переписываю отображение xml с помощью JoinedSubclassMapping<AppRole>, который работает, может построить фабрику сеанса и выполнить запрос без каких-либо исключений.

public class AppRoleMapping : JoinedSubclassMapping<AppRole> {

    public AppRoleMapping() {
        ExplicitDeclarationsHolder
            .AddAsRootEntity(typeof(NHIdentityRole));
        Extends(typeof(NHIdentityRole));
        Schema("public");
        Table("app_roles");
        Key(k => k.Column("id"));
        Property(
            p => p.Description,
            maping => {
                maping.Column("description");
                maping.Type(NHibernateUtil.String);
                maping.Length(256);
            }
        );
    }

}

Итак, проблема в следующем:

  • при использовании JoinedSubclassMapping<T> для расширения сборки сопоставлений с помощью ClassMapping<T>, он работает _01_CanExtendByCodeWithByCode ;
  • при использовании сопоставления joined-subclass из xml для расширения сборки сопоставлений с ClassMapping<T>, получите исключение NHibernate.MappingException : These classes referenced by 'extends' were not found _02_CanExtendByCodeWith Xml;
  • при использовании joined-subclass xml mappin g для расширения class xml отображения, он работает _03_CanExtendXmlBy Xml;
  • при использовании JoinedSubclassMapping<AppRole> для расширения class отображения xml, работает _04_CanExtendXmlByByCode ;

Полный тестовый код приведен здесь: https://github.com/nhibernate/NHibernate.AspNetCore.Identity/blob/master/test/UnitTest/IdentityTest.cs

Возможно, что-то я не так делаю, или есть проблемы с отображениями nhibernate

1 Ответ

0 голосов
/ 21 января 2020

После отладки и проверки исходного кода NHibernate.Cfg.Configuration существует внутренняя очередь проверки для обработки отображений, добавленных xml, но теперь есть способ пропустить ее, поэтому простая работа вокруг преобразование HbmMapping в xml, затем добавление xml в конфигурацию, давайте проверим его дважды.

var mapper = new ModelMapper();
mapper.AddMapping<IdentityRoleMappingPostgreSql>();
// add other mapping here.
var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
// Use AddXml instead of AddMappings
cfg.AddXml(mapping.AsString());
...