在以下代码中调用 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();
}
但是当我这样做时:
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();
}
get 方法中的“实体”在您迭代它时会引发异常:
Invalid cast from 'System.Int32' to 'TEntity' (where TEntity is the type name)
有人知道为什么吗?
编辑:这是不同的表达方式:
在泛型版本(顶部)中,它似乎出于某种原因试图转换 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()}
(为清楚起见省略了命名空间)
第二次编辑:似乎是当它尝试在 IEntity 和实例类型(TEntity)之间进行转换时
这是 IEntity:
public interface IEntity
{
int Id { get; }
}
第三次编辑:似乎是导致 AssociationVisitor 无法正确访问表达式树并转换“Convert(x).Id”的 Convert(x)
第四次编辑:我们走了,有人已经发现了这个错误https://nhibernate.jira.com/browse/NHLQ-11!
谢谢
安德鲁