NHibernate MappingException:持久性 class TodoLog 未找到
NHibernate MappingException: persistent class TodoLog not found
我有两个 classes Todo
和 TodoLog
我已经为它们各自的构造函数创建了映射和一些单元测试。
当我 运行 这些测试时,我收到错误 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")]
我们应该使用其中之一
NameType
或
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")]
我有两个 classes Todo
和 TodoLog
我已经为它们各自的构造函数创建了映射和一些单元测试。
当我 运行 这些测试时,我收到错误 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")]
我们应该使用其中之一
NameType
或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 beenTable
[Class(NameType = typeof(TodoLog), Table = "TodoLog")]