我使用Nhibernate 2.1.2.4000 GA与Nhibernate.Linq 1.0和最新版本的FluentNhibernate从github上的master下载 .
我正在做一些测试,每当我尝试删除由linq查询检索的实体时,我收到此错误:
没有持久性:NHibernate.Linq.Query`1 [[Employees.Core.Entities.Employee,Employees.Core,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]
所有其他操作(插入,更新和选择)看起来很好;
我的实体类:
public class Employee
{
public Employee()
{
}
public virtual Int32 Id { get; private set; }
public virtual String Name { get; set; }
public virtual String SayHello()
{
return String.Format("'Hello World!', said {0}.", Name);
}
}
映射类:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Id(x => x.Id);
Map(x => x.Name)
.Not.Nullable()
.Length(50);
}
}
组态:
Assembly mappingsAssemly = Assembly.GetExecutingAssembly();
return Fluently.Configure()
.Database( MsSqlConfiguration.MsSql2008
.ConnectionString(connectionString)
.ProxyFactoryFactory(typeof(ProxyFactoryFactory))
.ShowSql())
.Mappings( m => m.FluentMappings.AddFromAssembly(mappingsAssemly))
.BuildSessionFactory();
并且代码不起作用:
public void RemoveAll()
{
var q = from employee in _session.Linq<Employee>()
select employee;
foreach (var employee in q.ToList())
{
_session.Delete(q);
}
}
有什么想法吗?
3 回答
我们都错过了!
对不起,伙计们,谢谢你的帮助,但我只是想通了 .
如果你注意RemoveAll()方法,你会看到我试图删除不是实体的“q”对象,而是IQueriable而不是传递“employee” . 这是缺乏关注 .
正确的代码是:
你确定你提供给FNH(
Assembly.GetExecutingAssembly()
)的装配实际上是包含你的映射的装配吗?修改
Mappings
调用以包含ExportTo
方法,该方法不是FNH问题,可能是Linq提供程序的问题(正如Michael所说) .您可以检查的另一件事是NH实际使用的NHibernate配置实例 . 为此,请使用
BuildConfiguration
而不是BuildSessionFactory
并检查结果;有一个ClassMappings
集合(或其中的一些变体),它应该包含所有映射的实体 .如果看起来不错,那么尝试使用Criteria API或HQL创建查询,看看是否能解决您的问题(在这种情况下,它几乎肯定是linq提供者) .
它可能只是Linq提供程序中的一个错误 . 您可能希望尝试针对最新的NHibernate主干重现问题,其中包括新的/不同的Linq提供程序 . 或者,如果您(成功)从等式中删除Fluent NHibernate,您可能(相对容易)提交针对Linq提供程序的测试用例/错误报告 .