我有两个类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
类在该列表中。
答案 0 :(得分:0)
我想说的是,问题会出现在加倍的 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"
while int TodoLog
..
Name = "TodoLog"
这就是异常的来源:
无法加载类型
TodoLog
。MappingException:找不到持久类
TodoLog
因为我们需要 MyNamespace.TodoLog, MyAssembly
注意:很有可能
Name
应该是Table
[Class(NameType = typeof(TodoLog), Table = "TodoLog")]