我迷迷糊糊到下一个问题......我有数据库方面:使用IQueryable的<TEntity>代替DbSet <TEntity>问题
// For support unit testing...
public interface IDbContext : IDisposable
{
IQueryable<Hardware> Hardwares { get; }
IQueryable<ProviderHardware> ProviderHardwares { get; }
}
// Real DbContext (EF 4.0, Code First)
public class PrimaryDbContext : DbContext, IDbContext
{
public DbSet<Hardware> Hardwares { get; set; }
public DbSet<ProviderHardware> ProviderHardwares { get; set; }
IQueryable<Hardware> IDbContext.Hardwares
{ get { return Hardwares; } }
IQueryable<ProviderHardware> IDbContext.ProviderHardwares
{ get { return ProviderHardwares; } }
...
}
,我要尽量让所有的硬件,这犯规存在于ProviderHardwares表:
var hardwaresRemoved = db.Hardwares.Where(i => (i.IsAvailable == true) &&
(db.ProviderHardwares.Count(j => j.Article == i.Article) == 0)).ToList();
如果我严格使用PrimaryDbContext,如“PrimaryDbContext db = new PrimaryDbContext();”一切正常。但是,如果我隐式使用它“IDbContext db = new PrimaryDbContext();”我得到一个异常:
无法创建 型“ConfiguratorMvcApplication.DomainModels.ProviderHardware”的恒定值。在此上下文中仅支持 基本类型('Int32,String和Guid')。
总结,我不能替换IQueryable上的DbSet。在这种情况下我该如何使用单元测试?我希望有人已经解决了这个问题呢... 非常感谢提前!
你是否在你的'PrimaryDbContext'中的任何地方声明了一个常量? –
不,只有我以前展示过......并且重写OnModelCreating方法更多... – xtmq
我可以重现这一点。我还看到(使用SQL Profiler)在'IDbContext'情况下,表达式内的'db.ProviderHardwares'被执行为查询,从数据库加载* all *'ProviderHardware'行(* if as *'IDbContext.ProviderHardwares '是IEnumerable'而不是'IQueryable')。然后'Count'和外部查询无法执行,因为内存列表中的对象(“常量”对象列表)不能在SQL中使用。这导致异常。为什么EF将'IDbContext.ProviderHardwares'视为'IEnumerable'而不是'PrimaryDbContext.ProviderHardwares'?没有线索... – Slauma