nhibernate - сопоставить одну таблицу многим родителям

У меня есть один класс, который используется для регистрации изменений во всех других классах в моей системе:

public class HistoryLogEntry
{
    public virtual long Id { get; set; }

    public virtual string EntityQualifiedId { get; set; } // <-- this contains both the entity name and entity id to properly identify object
    public virtual long? IdEntity { get; set; }
    public virtual DateTime? EntryDate { get; set; }
    public virtual UserInfo CreatedBy { get; set; }
    public virtual string LogData { get; set; }
}

Я хочу иметь другие объекты, которые имеют список объектов HistoryLogEntry:

public class Person
{
    [...]

    public virtual IList<HistoryLogEntry> HistoryLogEntryList { get; set; }
}

public class Dog
{
    [...]

    public virtual IList<HistoryLogEntry> HistoryLogEntryList { get; set; }
}

Обратите внимание, что в HistoryLogEntry нет ссылок ни на Person, ни на Dog - и это нормально, потому что я хочу использовать класс HistoryLogEntry в Person и Dog.

Как я могу сопоставить это отношение, чтобы схема экспорта NHibernate создала все необходимые столбцы? Прямо сейчас я пытаюсь с:

public class HistoryLogEntryMapping : ClassMapping<HistoryLogEntry>
{
    public HistoryLogEntryMapping()
    {
        Lazy( true );
        Table( MappingSettings.GetTableName( "HistoryLogEntry", "SYS" ) );
        Id( x => x.Id, map => map.Generator( new ISLib3.Storage.NH.MultipleHiLoPerTableGeneratorDef() ) );
        Property( x => x.EntityQualifiedId, map => { map.Length( 255 ); map.NotNullable( true ); map.Index( "HistoryLogEntry_EntityQualifiedId" ); } );
        Property( x => x.IdEntity, map => { map.NotNullable( false ); } );          

        Property( x => x.EntryDate );
        ManyToOne( x => x.CreatedBy, map =>
        {
            map.Cascade( Cascade.None );
            map.Column( "IdCreatedBy" );
            map.Lazy( LazyRelation.Proxy );
            map.NotNullable( false );
            map.NotFound( NotFoundMode.Ignore );
        } );

        Property( x => x.LogData, map => { map.NotNullable( false ); map.Type( NHibernateUtil.StringClob ); } );
    }
}

public class PersonMapping : ClassMapping<Person>
{
    public PersonMapping()
    {
        Lazy( true );
        BatchSize( 10 );
        Table( MappingSettings.GetTableName( "Person" ) );
        Id( x => x.Id, map => map.Generator( new ISLib3.Storage.NH.MultipleHiLoPerTableGeneratorDef() ) );

        Bag( x => x.HistoryLogEntryList, map =>
        {
            // foreign key name MUST be set to "none" - this way ExportSchema will not generate keys in DB!
            map.Key( k => { k.Column("IdEntity" ); k.ForeignKey( "none" ); k.OnDelete( OnDeleteAction.NoAction ); } );
            map.Cascade( Cascade.None );
            map.Loader( "historyLogLoader" ); // <-- note that I have special loader to load HistoryLogEntry based on column EntityQualifiedId
            map.Lazy( CollectionLazy.Lazy );
            map.Inverse( true );
            map.BatchSize( 10 );
        }, rm=>rm.OneToMany() );

    }
}

Однако при использовании NHibernate 3.3 и ExportSchemat он не создает столбец IdEntity в HistoryLogEntry, и я верю, что мне нужен этот столбец, чтобы NHibernate узнал, что HistoryLogEntries помещен в мою коллекцию.

Любая помощь будет оценена.

1 ответ

Хорошо, похоже, что "скрытая особенность" nHibernate вызывала все эти проблемы: очевидно, nHibernate не будет создавать столбец с именем "IDENTITY". Как только я изменил имя столбца на другое, все стало работать.

Другие вопросы по тегам