tôi vấp phải vấn đề tiếp theo ... Tôi có bối cảnh cơ sở dữ liệu:Sử dụng IQueryable <TEntity> thay DbSet <TEntity> vấn đề
// 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; } }
...
}
Và tôi cố gắng nhận được tất cả phần cứng, mà doesnt tồn tại trong bảng ProviderHardwares:
var hardwaresRemoved = db.Hardwares.Where(i => (i.IsAvailable == true) &&
(db.ProviderHardwares.Count(j => j.Article == i.Article) == 0)).ToList();
Nếu tôi sử dụng PrimaryDbContext đúng như "PrimaryDbContext db = new PrimaryDbContext();" tất cả đều ổn. Nhưng nếu tôi sử dụng nó ngầm "IDbContext db = new PrimaryDbContext();" tôi có ngoại lệ:
Không thể tạo giá trị không đổi loại 'ConfiguratorMvcApplication.DomainModels.ProviderHardware'. Chỉ có loại nguyên thủy ('chẳng hạn như Int32, Chuỗi và Hướng dẫn') được hỗ trợ trong ngữ cảnh này.
Tóm tắt, tôi không thể thay thế DbSet trên IQueryable. Và làm thế nào tôi có thể sử dụng thử nghiệm đơn vị trong trường hợp này? Tôi hy vọng một người nào đó đã giải quyết vấn đề này ... Cảm ơn trước rất nhiều!
Bạn có khai báo hằng số ở bất kỳ đâu trong 'PrimaryDbContext' không? –
Không, chỉ có tôi chứng minh trước đây ... Và ghi đè lên phương pháp OnModelCreating nhiều hơn nữa ... – xtmq
Tôi có thể tạo lại điều này. Tôi cũng thấy (với SQL Profiler) rằng trong trường hợp 'IDbContext'' db.ProviderHardwares' bên trong biểu thức được thực hiện như một truy vấn tải * tất cả * 'ProviderHardware' hàng từ cơ sở dữ liệu (* như thể *' IDbContext.ProviderHardwares 'là một 'IEnumerable' và không phải' IQueryable'). Sau đó, 'Đếm' và truy vấn bên ngoài không thể được thực thi vì danh sách bộ nhớ của các đối tượng (danh sách các đối tượng" hằng số ") không thể được sử dụng trong SQL. Điều này gây ra ngoại lệ. Tại sao EF xử lý 'IDbContext.ProviderHardwares' như một' IEnumerable' nhưng không phải là 'PrimaryDbContext.ProviderHardwares'? Không có đầu mối ... – Slauma