NHibernate MappingException:持久性 class TodoLog 未找到

NHibernate MappingException: persistent class TodoLog not found

我有两个 classes TodoTodoLog 我已经为它们各自的构造函数创建了映射和一些单元测试。 当我 运行 这些测试时,我收到错误 Could not load type TodoLog. Possible cause no assembly name specified 和 innerexception MappingException: persistent class TodoLog not found。 即使我 运行 对 Todo 构造函数的测试,错误也总是指 TodoLog 。 两个 classes 的映射都相当简单。

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 并添加不同的 class TodoTest 会导致 TodoTest 出现相同的错误。 我还使用 .Net Reflector 来检查 class 是否正确编译,但一切似乎都很好。

当我 运行 调试代码时,测试加载包含 TodoLog:

的程序集时发生错误
foreach(var a in projectsAssemblies)
{
    Configuration.AddInputStream(HbmSerializer.Default.Serialize(a));
}

当查看包含 TodoLog 的程序集的 属性 ExportedTypes 时,TodoLog class 在该列表中。

我想说的是,问题出在双重 NAME 映射中:

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

我们应该使用其中之一

  1. NameType
  2. Name

因为我们可以在 (source) 中看到 - 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"

而整数 TodoLog ..

Name = "TodoLog"

这就是异常的来源:

Could not load type TodoLog.

MappingException: persistent class TodoLog not found

因为我们需要MyNamespace.TodoLog, MyAssembly

NOTE: mostlikely the Name should have been Table [Class(NameType = typeof(TodoLog), Table = "TodoLog")]