NHibernate MappingException: постоянный класс TodoLog не найден - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть два класса Todo и TodoLog, для которых я создал отображение, и несколько юнит-тестов для их соответствующих конструкторов. Когда я запускаю эти тесты, я получаю ошибку Could not load type TodoLog. Possible cause no assembly name specified с неисключением MappingException: persistent class TodoLog not found. Ошибка всегда относится к TodoLog, даже когда я запускаю тест для конструктора Todo. Отображение для обоих классов довольно простое.

Отображение для Todo:

[Class(NameType = typeof()Todo, Table = "Todo")]
public class Todo
{
    [Id(-2, Name = "Id")]
    [Generator(-1, Class = "native")]
    public virtual long Id { get; set; }

    [Property]
    public virtual string Title { get; set; }

    [Property]
    public virtual Guid TodoGuid { get; set; }

    private IList<TodoLog> logs = new List<TodoLog>();
    [Bag(0, Name = "Logs", Table = "TodoLog", Inverse = true)]
    [Key(1, Column = "Todo")]
    [OneToMany(2, ClassType = typeof(TodoLog)]
    public virtual IEnumerable<TodoLog> Logs
    {
        get => logs;
        protected set => log = (IList<TodoLog>)value;
    }
}

Отображение для TodoLog

[Class(NameType = typeof(TodoLog), Name = "TodoLog")]
public class TodoLog
{
    [Id(-2, Name = "Id")]
    [Generator(-1, Class = "native")]
    public virtual long Id { get; set; }

    [ManyToOne]
    public virtual Todo Todo { get; set; }

    [Property]
    public virtual Enums.TodoAction Action { get; set; }

    [ManyToOne]
    public virtual User ExecutedBy { get; set; }

    [Property]
    public virtual DateTime ExectutedOn { get; set; }
}

======== РЕДАКТИРОВАТЬ ========

Когда я помещаю весь код TodoLog в комментарии, тесты запускаются нормально, но как только я добавляю Class -атрибут к TodoLog, я получаю ту же ошибку, что и раньше. Полное удаление TodoLog и добавление другого класса TodoTest приводит к той же ошибке для TodoTest. Я также использовал .Net Reflector, чтобы проверить, правильно ли скомпилирован этот класс, но там все выглядит нормально.

При отладке кода при запуске теста возникает ошибка при загрузке сборки, содержащей TodoLog:

foreach(var a in projectsAssemblies)
{
    Configuration.AddInputStream(HbmSerializer.Default.Serialize(a));
}

При просмотре свойства ExportedTypes сборки, содержащей TodoLog, класс TodoLog находится в этом списке.

1 Ответ

0 голосов
/ 09 ноября 2018

Проблема, я бы сказал, была бы в удвоенном ИМЯ отображение:

[Class(NameType = typeof(TodoLog), Name = "TodoLog")]

Мы должны использовать либо

  1. NameType или
  2. Name

Потому что, как мы видим из ( источника ) - NameType в конце заполняет Name:

    public virtual string Name
    {
        get
        {
            return this._name;
        }
        set
        {
            this._name = value;
        }
    }

    /// <summary> </summary>
    public virtual System.Type NameType
    {
        get
        {
            return System.Type.GetType( this.Name );
        }
        set
        {
            if(value.Assembly == typeof(int).Assembly)
                this.Name = value.FullName.Substring(7);
            else
                this.Name = HbmWriterHelper.GetNameWithAssembly(value);
        }
    }

Так в чем же проблема?

При отображении Log мы используем NameType

[Class(NameType = typeof()Todo, Table = "Todo")]

значение Имя является правильным ... значение, с полное имя

Name = "MyNamespace.TodoLog, MyAssembly"

в то время как int TodoLog ..

Name = "TodoLog"

И это источник исключения:

Не удалось загрузить тип TodoLog.

MappingException: постоянный класс TodoLog не найден

Потому что нам нужно MyNamespace.TodoLog, MyAssembly

ПРИМЕЧАНИЕ: скорее всего, Name должен был быть Table [Class(NameType = typeof(TodoLog), Table = "TodoLog")]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...