5
public class Order 
{ 
public int Id {get;set;} 
[DisplayName("User")] 
public long UserId { get; set; } 
[ForeignKey("UserId")] 
public virtual User User { get; set; } 
public decimal Amount { get; set; } 
} 
IEnumurable

आईसीलेक्शन के बजाय एक आईनेमरेबल का पर्दाफाश कब करें?

public class User 
{ 
public int Id{get;set;} 
public virtual IEnumerable<Order> Orders { get; set; } 
} 

public User GetWithOrders() 
{ 
var myUser=UserRepository.GetByEmail("[email protected]"); 
myUser.Orders=OrderRepository.GetByUserId(myUser.Id); 
return myUser; 
} 

साथ

ICollection

public class User 
{ 
public int Id{get;set;} 
public virtual ICollection<Order> Orders { get; set; } 
} 

public User GetWithOrders() 
{ 
var myUser=UserRepository.GetByEmail("[email protected]"); 
return myUser; 
} 

के साथ मैं आलसी लोड हो रहा है एक नेविगेशन संपत्ति के लिए IEnumerable का उपयोग कर की जरूरत नहीं है। इसलिए, मुझे इस उपयोगकर्ता के लिए एक और क्वेरी के साथ ऑर्डर प्राप्त करना होगा।

मेरे पास ICollection के साथ नेविगेशन है। तो मैं उपयोगकर्ता से आदेश तक पहुंच सकता हूं। यह अच्छा लगता है। लेकिन फिर मैं सेवा या भंडार का उपयोग किए बिना नियंत्रक में उपयोगकर्ता को नए ऑर्डर जोड़ सकता हूं।

यह नियंत्रक स्तर पर डेटा को जोड़ना है। क्या यह विरोधी पैटर्न है?

उत्तर

2

लेकिन [ICollection के साथ] मैं सेवा या भंडार का उपयोग किए बिना नियंत्रक में नया ऑर्डर जोड़ सकता हूं।

आप (वहाँ एक उपयोगकर्ता के लिए एक आदेश जोड़ने के लिए एक viewmodel और एक SaveChanges() कहीं न कहीं यह सोचते हैं) यह कर सकते हैं मतलब है:

public class UserController 
{ 
    public ActionResult AddUserOrder(AddUserOrderModel addOrder) 
    { 
     User user = User.GetByEmail(addOrder.UserEmail);   
     user.Orders.Add(addOrder.Order); 
     User.SaveChanges(); 
    } 
} 

और विशेष रूप से आप user.Orders.Add(...) ऐसा कर सकते हैं, तो वह एक पक्ष प्रभाव है आपकी सेवा या रिपोजिटरी परत से इकाई प्रकारों को उजागर करने का।

public class UserBLL 
{ 
    public int Id { get; private set; } 
    public IEnumerable<Order> Orders { get { return _orders.AsEnumerable(); } } 
    private IEnumerable<Order> _orders; 

    public UserBLL(User user) 
    { 
     Id = user.Id; 
     _orders = user.Orders;   
    } 

    public void AddOrder(Order order) 
    { 
     _orders.Add(order); 
    } 
} 
+0

सबसे पहले, मैंने भी विचार-विमर्श किया। लेकिन मुझे यकीन नहीं था कि इससे अधिक जटिलता आ सकती है या नहीं। अगर मुझे करना है तो मैं व्यूमोडेल का उपयोग करूंगा। धन्यवाद। –

+0

बिंदु वास्तव में दृश्यमान नहीं है। यह बीएलएल या डोमेन मॉडल है। एक ऑब्जेक्ट जो आपके उपयोग के मामले का प्रतिनिधित्व करता है (एक उपयोगकर्ता जो ऑर्डर कर सकता है)। इसका प्रयोग करें यदि आप अपने डेटा मॉडल का खुलासा नहीं करना चाहते हैं। – CodeCaster

+0

आप '_orders.AsNumerable(); ''' _orders' क्यों लौट रहे हैं ''' '' '' '_numerable '? –

1

यहां कोई वास्तविक विकल्प नहीं है। ICollection ईएफ द्वारा इसके कुछ पहलुओं को नियंत्रित करने की आवश्यकता है जैसे बाध्यकारी क्वेरी परिणाम और आलसी लोडिंग। IEnumerable का उपयोग करके, आप अनिवार्य रूप से इस कार्यक्षमता को बंद कर रहे हैं, लेकिन इसके साथ ही, आपकी अंतर्निहित संरचना की ईएफ की समझ। जब आप माइग्रेशन उत्पन्न करते हैं, तो ईएफ एम 2 एम रिश्तों, संबंधित तालिकाओं पर विदेशी कुंजी आदि के लिए अपेक्षित अंतर्निहित तालिकाओं को उत्पन्न नहीं करेगा।

लंबा और छोटा, ICollection का उपयोग करें। जबकि आप सही हैं कि यह आपको संबंधित इकाई, सैन्स-डीएएल पर संग्रह में उन्हें जोड़कर आइटम जोड़ने की अनुमति देता है, फिर भी वे संदर्भ के बिना सहेजे नहीं जा सकते हैं। यदि आपने अपना डीएएल सही तरीके से स्थापित किया है, तो यह केवल डीएएल के माध्यम से ही उपलब्ध है, इसलिए आपको अभी भी इन परिवर्तनों में से किसी एक को बनाए रखने के लिए इकाई को अपनी डीएएल पाइपलाइन में पास करना होगा। दूसरे शब्दों में, इसके बारे में चिंता न करें।

+0

मैं आईओसी उपयोग कर रहा हूँ:

आपको लगता है कि बचना चाहते हैं, तो आप को परिभाषित करने और सदस्यों को आप को बेनकाब करना चाहते हैं एक व्यापार वस्तु को बेनकाब करना होगा। संदर्भ प्रति अनुरोध द्वारा साझा किया गया। उसी अनुरोध में यदि मैंने इसे किसी अन्य उद्देश्य के लिए प्रतिबद्ध किया है, तो यह प्रभावित हो सकता है। लेकिन आप सही हैं मुझे लगता है कि मेरे पास कोई ऐसी क्रिया नहीं है जो रिलेशनल क्वेरी का चयन करे, फिर उसी अनुरोध पर सहेजें या संपादित करें। यदि मेरे पास है तो मैं व्यूमोडेल का उपयोग करूंगा जो @ कोडेकस्टर ने बताया था। –

संबंधित मुद्दे