मैं अगले समस्या के लिए ठोकर खाई ... मैं डेटाबेस संदर्भ है:IQueryable <TEntity> का उपयोग बजाय <TEntity> समस्या DbSet
// 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 db = new PrimaryDbContext();" सब ठीक काम करते हैं। लेकिन अगर मैं इसे स्पष्ट रूप से उपयोग करता हूं "IDbContext db = new PrimaryDbContext();"
प्रकार 'ConfiguratorMvcApplication.DomainModels.ProviderHardware' की एक निरंतर मूल्य बनाने में असमर्थ: है कि मैं एक अपवाद मिलता है। केवल आदिम प्रकार (जैसे इंट 32, स्ट्रिंग, और ग्विड ') इस संदर्भ में में समर्थित हैं।
संक्षेप में प्रस्तुत करना, मैं एक IQueryable पर एक DbSet बदल नहीं सकते। और मैं इस मामले में यूनिट परीक्षण का उपयोग कैसे कर सकता हूं? मुझे आशा है कि किसी ने अभी तक इस समस्या का समाधान किया है ... अग्रिम धन्यवाद!
क्या आप अपने 'प्राथमिक डीबीकॉन्टेक्स्ट' में कहीं भी निरंतर घोषणा कर रहे हैं? –
नहीं, केवल यही है कि मैं पहले प्रदर्शित करता हूं ... और ऑनमोडेल क्रिएटिंग विधि को ओवरराइड करें ... – xtmq
मैं इसे पुन: उत्पन्न कर सकता हूं। मैंने देखा (एसक्यूएल प्रोफाइलर के साथ) कि अभिव्यक्ति के अंदर 'आईडीबीकॉन्टेक्स्ट' केस 'डीबी.प्रोवाइडरहार्डवेयर' में एक क्वेरी के रूप में निष्पादित किया जाता है जो डेटाबेस से * सभी * 'प्रदाता हार्डवेयर 'पंक्तियों को लोड करता है (* जैसे *' आईडीबीकॉन्टेक्स्ट.प्रोवाइडरहार्डवेयर '' inumerable' थे और 'IQueryable' नहीं)। फिर 'गणना' और बाहरी क्वेरी निष्पादित नहीं की जा सकती क्योंकि ऑब्जेक्ट्स की स्मृति सूची ("निरंतर" ऑब्जेक्ट्स की सूची) का उपयोग SQL में नहीं किया जा सकता है। यह अपवाद का कारण बनता है। क्यों EF 'IDbContext.ProviderHardwares 'को' IENumerable' जैसा व्यवहार करता है लेकिन 'PrimaryDbContext.ProviderHardwares' नहीं? कोई सुराग नहीं ... – Slauma