NHibernate MappingException:找不到持久性类TodoLog

时间:2018-11-01 09:33:26

标签: c# sqlite nhibernate

我有两个类TodoTodoLog,分别为它们的构造函数创建了映射并进行了一些单元测试。 运行这些测试时,我收到带有内部异常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 :(得分:0)

我想说的是,问题会出现在加倍的 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"

while int TodoLog ..

Name = "TodoLog"

这就是异常的来源:

  

无法加载类型TodoLog

     

MappingException:找不到持久类TodoLog

因为我们需要 MyNamespace.TodoLog, MyAssembly

  

注意:很有可能Name应该是Table    [Class(NameType = typeof(TodoLog), Table = "TodoLog")]