代码之家  ›  专栏  ›  技术社区  ›  tucaz

nhibernate、nhibernate.linq和fluent映射的“no persister for”错误

  •  7
  • tucaz  · 技术社区  · 15 年前

    我用NHibernate 2.1.2.4000 GA和NHibernate.linq 1.0以及最新版本的FluentHibernate从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 回复  |  直到 8 年前
        1
  •  6
  •   tucaz    15 年前

    我们都错过了!

    抱歉,伙计们,谢谢你们的帮助,但我只是想。

    如果您注意removeall()方法,您将看到我试图删除“q”对象,它不是实体,而是可查询的,而不是传递“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);
                }
            }
    
        2
  •  2
  •   James Gregory    15 年前

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

    修改你的 Mappings 调用以包括 ExportTo 方法,它将把fnh找到的所有映射导出到指定文件夹;检查该文件夹的内容,并查看所有映射是否都在其中。如果是的话,那么很可能这不是一个FNH问题,可能是LINQ供应商的问题(如迈克尔所说)。

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

    您可以检查的另一件事是NH实际使用的NHibernate配置实例。要做到这一点,使用 BuildConfiguration 而不是 BuildSessionFactory 检查结果;有一个 ClassMappings 集合(或该集合的某些变体),其中应包含所有映射的实体。

    如果看起来不错,那么尝试使用标准API或HQL来创建查询,看看这是否解决了您的问题(在这种情况下,几乎可以肯定是LINQ提供程序)。

        3
  •  1
  •   Michael Maddox    15 年前

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