/ / रिपॉजिटरी पैटर्न और एंटिटी फ्रेमवर्क शामिल हैं - एंटिटी-फ्रेमवर्क, रिपॉजिटरी-पैटर्न

रिपोजिटरी पैटर्न और इकाई फ्रेमवर्क शामिल - इकाई-ढांचा, भंडार-पैटर्न

मैं EF के साथ रिपॉजिटरी पैटर्न का उपयोग कर रहा हूं, और मुझे लगता है कि मैं इस पर बहुत अधिक बेचा गया हूं, लेकिन एक सवाल बना हुआ है;

अगर मैं एक इकाई को लोड करने के लिए उत्सुक होना चाहता हूं, तो इसके लिए सबसे अच्छा तरीका क्या है?

उदाहरण के लिए, मेरे पास एक इकाई के लिए एक रिपॉजिटरी मैप किया गया है:

public class EFFooRepository : IFooRepository
{
public IQueryable<Foo> GetFoo()
{
.....
}
}

क्या होगा अगर मैं फू और बार ऑब्जेक्ट प्राप्त करना चाहता हूं

db.Foo.Include("Bar")

लेकिन मेरा भंडार केवल फू लौटाता है, तो क्या मुझे GetFooAndBar एक और विधि बनाने की आवश्यकता है?

क्या कोई बेहतर तरीका है?

उत्तर:

जवाब के लिए 0 № 1

यदि आपने आलसीपन को सक्षम किया है तो आप लोड कर सकते हैं Bar बाद में (जब आप संपत्ति का उपयोग करने जा रहे हैं)। लेकिन अगर आप एक तरीका लिखना चाहते हैं जो डेटा लोड करता है Foo साथ में Bar उसी समय हाँ, आपको विशिष्ट रिपॉजिटरी विधियों को लिखने की आवश्यकता है।


उत्तर № 2 के लिए 1

मैंने वही अनुभव किया। जब मैं रिपॉजिटरी पैटर्न को लागू करता हूं तो मैं IQueryable <T> और IEnumerable <T> का उपयोग करने में सक्षम होना चाहता था कि DbSet <T> (पुरानी पुरानी जानकारी छिपाना) को उजागर किए बिना DbSet <T> लागू किया गया था।

इसलिए मैंने सोचा कि रिपोजिटरी में सभी IQueryable / IEnumerable फ़ंक्शन को DbSet <T> के संबंधित फ़ंक्शन को कॉल करने के लिए पर्याप्त होगा।

आज तक जो मेरे सभी के लिए काफी थाIQueryable <T> फ़ंक्शन। आज मुझे पता चला कि IQueryable को छोड़कर। Include में वही समस्या थी जिसका आपने वर्णन किया था। कोई कंपाइलर त्रुटि नहीं है, लेकिन डेटा लोड नहीं है।

व्यापक परिणाम के बाद मैंने पाया कि इसका कारण MSDN विवरण में वर्णित है QueryableExtensions.Include विधि (IQueryable, स्ट्रिंग)

यदि इस तरह की विधि मौजूद है, तो यह विस्तार विधि स्रोत के समावेशी (स्ट्रिंग) विधि को IQueryable ऑब्जेक्ट कहती है। यदि स्रोत IQueryable में मिलान विधि नहीं है, तो यह विधि कुछ भी नहीं करती है।

तो मुझे बस इतना करना था कि एक मेल लिखना थामेरे रिपॉजिटरी में विवरण शामिल करें जो संबंधित DbSet रिपॉजिटरी को कॉल करेगा। IQueryable / IEnumerable फ़ंक्शन केवल DbSet के संबंधित फ़ंक्शन को कॉल करते हैं:

public class Repository<T> :
System.Linq.IQueryable<T>, System.Collections.Generic.IEnumerable<T>,
System.Linq.IQueryable, System.Collections.IEnumerable
where T : class, new()
{
public Repository(DbContext dbContext)
{
this.dbContext = dbContext;
this.dbSet = dbContext.Set<T>();
}

public readonly DbSet<T> dbSet;
private readonly DbContext dbContext;

public virtual DbQuery<T> Include(string path)
{
return this.dbSet.Include(path);
}

// other Repository functions: Find / Add / Update / Remove etc

IQueryable / IEnumerable कार्यान्वयन के लिए पूर्णता:

    #region IQueryable
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return ((IQueryable<T>)this.dbSet).GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)this.dbSet).GetEnumerator();
}

Type IQueryable.ElementType
{
get { return ((IQueryable<T>)this.dbSet).ElementType; }
}

System.Linq.Expressions.Expression IQueryable.Expression
{
get { return ((IQueryable)this.dbSet).Expression; }
}

IQueryProvider IQueryable.Provider
{
get { return ((IQueryable)this.dbSet).Provider; }
}
#endregion IQueryable

अब निम्नलिखित काम करता है, पता शामिल है:

using (MyDbContext dbContext = new MyDbContext(...))
{
Repository<Customer> customers = new Repository<Customer>(dbContext);
var happyCustomers = customers
.Include(customer => customer.Address)
.Where(customer => customer.IsHappy);
Show(happyCustomers);
}