奇怪的linq到nhibernate问题,来自'System.Int32'的无效转换

And*_*ock 12 nhibernate linq-to-nhibernate

调用以下代码中的Get工作正常:

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();
    }
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

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();
    }
Run Code Online (Sandbox Code Playgroud)

当你迭代它时,get方法中的"实体"会引发异常:

Invalid cast from 'System.Int32' to 'TEntity' (where TEntity is the type name)
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么?

编辑:这是不同的表达式的样子:

在通用版本(前一个)中,似乎是出于某种原因试图转换x,这必须是因为泛型: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()}
Run Code Online (Sandbox Code Playgroud)

(为清楚起见省略了名称空间)

第2次编辑:似乎是在尝试在IEntity和实例类型(TEntity)之间进行转换时

这是IEntity:

public interface IEntity
{
    int Id { get; }
}
Run Code Online (Sandbox Code Playgroud)

3rd Edit:它似乎是Convert(x)导致AssociationVisitor没有正确访问表达式树并转换"Convert(x).Id"

第4编辑:我们去了,有人已经找到了bug https://nhibernate.jira.com/browse/NHLQ-11!

谢谢

安德鲁

Sop*_*are 1

我过去遇到过这个问题,通常可以归结为您正在读取的数据库表中的字段格式不兼容。就像布尔值不会转换为整数一样。

检查表中的字段类型并确保它们兼容。也许您的 Id 列是 BIGINT?