2010-01-22 11 views
5

J'utilise Nhibernate 2.1.2.4000 GA avec Nhibernate.Linq 1.0 et la dernière version de FluentNhibernate téléchargée depuis master sur github.Erreur "Pas de persistance pour" avec NHibernate, NHibernate.Linq et Mappage Fluent

Im faire quelques tests et chaque fois que je tente de supprimer une entité récupérée par une requête de je suis LINQ obtenir cette erreur:

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

Toutes les autres opérations (insertion, mise à jour et sélectionnez) semble bien;

classe Mon entité:

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 class:

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

Configuration:

Assembly mappingsAssemly = Assembly.GetExecutingAssembly(); 

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

Et le code qui ne fonctionne pas:

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

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

Des pensées?

+1

+1 question extrêmement bien écrit! –

Répondre

4

Nous l'avons tous manqué!

Désolé les gars et merci pour toute votre aide mais je me suis juste figuré. Si vous faites attention à la méthode RemoveAll() vous verrez que j'essaye de supprimer l'objet "q" qui n'est pas une entité, mais un IQueriable au lieu de passer "employee". C'était un manque d'attention.

Le bon code serait:

 
     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

Très gentil, vous avez posté votre réponse, de sorte qu'il se transforme en mauvaise utilisation NH ... –

1

Il peut s'agir simplement d'un bogue dans le fournisseur Linq. Vous pouvez essayer de reproduire le problème avec la dernière ligne de réseau NHibernate qui inclut un nouveau/différent fournisseur Linq. Alternativement, si vous supprimez (avec succès) NHibernate Fluent de l'équation, vous pouvez probablement (assez facilement) soumettre un rapport de cas de test/bug contre le fournisseur Linq.

2

Etes-vous certain que l'assemblage que vous fournissez à FNH (Assembly.GetExecutingAssembly()) est en fait celui qui contient vos correspondances?

Modifiez votre appel Mappings pour inclure la méthode ExportTo, qui exportera tous les mappages trouvés par FNH dans un dossier spécifié; vérifier le contenu de ce dossier et voir si tous les mappages sont là. Si tel est le cas, il y a de fortes chances que ce ne soit pas un problème FNH et que cela puisse poser un problème avec le fournisseur Linq (comme l'a dit Michael).

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

Une autre chose que vous pouvez vérifier est l'instance de NHibernate Configuration utilisée par NH. Pour ce faire, utilisez BuildConfiguration au lieu de BuildSessionFactory et inspectez le résultat; il y a une collection ClassMappings (ou une variation de cela), qui devrait contenir toutes les entités mappées. Si cela vous convient, essayez plutôt de créer votre requête à l'aide de l'API Criteria ou HQL, pour voir si cela résout votre problème (et dans ce cas, il est presque certain d'être le fournisseur linq).

+0

+1 Cela ferait une très bonne page wiki de dépannage généralisée pour FluentNH, si ce n'est déjà fait! –