Calling Get dans le code suivant fonctionne très bien:LINQ étrange question NHibernate, non valide cast de 'System.Int32'
public class ContractService : IContractService
{
private readonly IRepository<Contract> repository;
public ContractService(IRepository<Contract> repository)
{
this.repository = repository;
}
public Contract Get(int contractId)
{
return repository.Query().Where(x => x.Id == contractId).FirstOrDefault();
}
mais quand je fais ceci:
public class ContractService : CRUDService<Contract>, IContractService
{
public ContractService(IRepository<Contract> repository) : base(repository)
{
}
}
public class CRUDService<TEntity> : ICRUDService<TEntity> where TEntity : IEntity
{
protected readonly IRepository<TEntity> repository;
public CRUDService(IRepository<TEntity> repository)
{
this.repository = repository;
}
public TEntity Get(int id)
{
var entities = this.repository.Query().Where(s => s.Id == id);
return entities.FirstOrDefault();
}
"entités" à l'intérieur la méthode get lève une exception lorsque vous la parcourez:
Invalid cast from 'System.Int32' to 'TEntity' (where TEntity is the type name)
Vous avez des idées?
Edit: voici ce que les différentes expressions ressemblent:
Dans la version générique (en haut un), il semble essayer de convertir x pour une raison quelconque, qui doit être à cause des médicaments génériques: s
{value(NHibernate.Linq.Query`1[Contract]).Where(x => (Convert(x).Id = value(CRUDService`1+<>c__DisplayClass0[Contract]).Id)).FirstOrDefault()}
{value(NHibernate.Linq.Query`1[Contract]).Where(x => (x.Id = value(ContractService+<>c__DisplayClass2).Id)).FirstOrDefault()}
(namespaces omis pour plus de clarté)
2ème édition: il semble être quand il essaie de convertir entre IEntity et le type d'instance (TEntity)
ici est IEntity:
public interface IEntity
{
int Id { get; }
}
3ème édition: il semble être Convert (x) qui provoque la AssociationVisitor de ne pas correctement visiter l'arbre d'expression et de convertir "Convert (x) .id"
4 Edit: Et voilà, quelqu'un a déjà trouvé le bug https://nhibernate.jira.com/browse/NHLQ-11!
Merci
Andrew
Cela semble très étrange. Avez-vous des journaux de ce que SQL est en cours d'exécution? À quoi ressemble le reste de la pile? –
Aucun SQL ne semble être exécuté, il semble que la Linq échoue avant d'atteindre la base de données. Je viens de télécharger la source pour un débogage http://sourceforge.net/project/showfiles.php?group_id=216446&package_id=306405&release_id=654054 –
J'ai aussi rencontré ce problème! – bleevo