2010-01-22 8 views
5

Ich benutze Nhibernate 2.1.2.4000 GA mit Nhibernate.Linq 1.0 und neueste Version von FluentNhibernate heruntergeladen von Master auf Github.Fehler "Keine Persister für" mit NHibernate, NHibernate.Linq und Fluent Mapping

Im tun einige Tests und wenn ich versuche, eine Einheit, die von einer Linq-Abfrage aus mir wird diesen Fehler abgerufen zu löschen:

No persister for: NHibernate.Linq.Query`1[[Employees.Core.Entities.Employee, Employees.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Alle anderen Operationen (Einfügen, Aktualisieren und wählen) sieht gut aus;

Meine Entity-Klasse:

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); 
    } 
} 

Mapping-Klasse:

public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name) 
      .Not.Nullable() 
      .Length(50); 
    } 
} 

Konfiguration:

Assembly mappingsAssemly = Assembly.GetExecutingAssembly(); 

return Fluently.Configure() 
    .Database(MsSqlConfiguration.MsSql2008 
        .ConnectionString(connectionString) 
        .ProxyFactoryFactory(typeof(ProxyFactoryFactory)) 
        .ShowSql())        
    .Mappings(m => m.FluentMappings.AddFromAssembly(mappingsAssemly)) 
    .BuildSessionFactory(); 

Und der Code, der nicht funktioniert:

public void RemoveAll() 
{ 
    var q = from employee in _session.Linq<Employee>() 
      select employee; 

    foreach (var employee in q.ToList()) 
    { 
     _session.Delete(q); 
    } 
} 

Irgendwelche Gedanken?

+1

+1 Sehr gut schriftliche Anfrage! –

Antwort

4

Wir alle haben es verpasst!

Sorry Leute und danke für all deine Hilfe, aber ich dachte nur.

Wenn Sie auf die RemoveAll() - Methode achten, werden Sie sehen, dass ich versuche, das "q" -Objekt zu löschen, das keine Entität ist, sondern ein IQueriable, anstatt "employee" zu übergeben. Es war Mangel an Aufmerksamkeit.

Der richtige Code wäre:

 
     public void RemoveAll() 
     { 
      var q = from employee in _session.Linq() 
        select employee; 

      var p = q.ToList(); 

      foreach (var employee in p) 
      { 
       _session.Delete(employee); 
      } 
     } 
+0

Sehr nett hast du deine Antwort gepostet, also schmilzt es zu NH Miss-Use ... –

1

Es kann nur ein Fehler im Linq-Anbieter sein. Sie können versuchen, das Problem mit dem neuesten NHibernate-Stamm zu reproduzieren, der einen neuen/anderen Linq-Anbieter enthält. Wenn Sie (erfolgreich) Fluent NHibernate aus der Gleichung entfernen, können Sie wahrscheinlich (relativ einfach) einen Testfall/Fehlerbericht an den Linq-Anbieter senden.

2

Sind Sie sicher, dass die Baugruppe, die Sie an FNH liefern (Assembly.GetExecutingAssembly()), tatsächlich die ist, die Ihre Abbildungen enthält?

Ändern Sie Ihren Mappings Aufruf, um die ExportTo-Methode einzuschließen, die alle Zuordnungen exportiert, die FNH in einem angegebenen Ordner findet; Überprüfen Sie den Inhalt dieses Ordners und sehen Sie, ob sich alle Zuordnungen dort befinden. Wenn dies der Fall ist, besteht die Möglichkeit, dass es sich nicht um ein FNH-Problem handelt, und es könnte ein Problem mit dem Linq-Anbieter sein (wie Michael sagte).

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

Eine andere Sache, die Sie überprüfen können, ist die NHibernate Configuration-Instanz, die NH tatsächlich verwendet. Verwenden Sie dazu BuildConfiguration anstelle von BuildSessionFactory und überprüfen Sie das Ergebnis; Es gibt eine ClassMappings Sammlung (oder eine Variation davon), die alle zugeordneten Entitäten enthalten sollte.

Wenn das gut aussieht, versuchen Sie, Ihre Abfrage mit der Criteria-API oder HQL zu erstellen, sehen Sie, ob das Ihr Problem behebt (und in diesem Fall ist es fast sicher der linq-Provider).

+0

+1 Dies würde eine ziemlich gute generalisierte Fehlersuche Wiki-Seite für FluentNH machen, wenn es nicht bereits ist! –