首页 文章

NHibernate,NHibernate.Linq和Fluent Mapping中的“没有持久性”错误

提问于
浏览
7

我使用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 回答

  • 1

    我们都错过了!

    对不起,伙计们,谢谢你的帮助,但我只是想通了 .

    如果你注意RemoveAll()方法,你会看到我试图删除不是实体的“q”对象,而是IQueriable而不是传递“employee” . 这是缺乏关注 .

    正确的代码是:

    public void RemoveAll()
            {
                var q = from employee in _session.Linq()
                        select employee;
    
                var p = q.ToList();
    
                foreach (var employee in p)
                {
                    _session.Delete(employee);
                }
            }
    
  • 6

    你确定你提供给FNH( Assembly.GetExecutingAssembly() )的装配实际上是包含你的映射的装配吗?

    修改 Mappings 调用以包含 ExportTo 方法,该方法不是FNH问题,可能是Linq提供程序的问题(正如Michael所说) .

    Mappings(
      m => m.FluentMappings
              .AddFromAssembly(mappingsAssemly)
              .ExportTo(@"C:\"));
    

    您可以检查的另一件事是NH实际使用的NHibernate配置实例 . 为此,请使用 BuildConfiguration 而不是 BuildSessionFactory 并检查结果;有一个 ClassMappings 集合(或其中的一些变体),它应该包含所有映射的实体 .

    如果看起来不错,那么尝试使用Criteria API或HQL创建查询,看看是否能解决您的问题(在这种情况下,它几乎肯定是linq提供者) .

  • 2

    它可能只是Linq提供程序中的一个错误 . 您可能希望尝试针对最新的NHibernate主干重现问题,其中包括新的/不同的Linq提供程序 . 或者,如果您(成功)从等式中删除Fluent NHibernate,您可能(相对容易)提交针对Linq提供程序的测试用例/错误报告 .

相关问题