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!
谢谢
安德鲁
我过去遇到过这个问题,通常可以归结为您正在读取的数据库表中的字段格式不兼容。就像布尔值不会转换为整数一样。
检查表中的字段类型并确保它们兼容。也许您的 Id 列是 BIGINT?
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |