c# - net - हिंदी में फॉक्सप्रो परिभाषा




इकाई फ्रेमवर्क 5 रिकॉर्ड अपडेट कर रहा है (5)

आप क्या देख रहे हैं:

db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();

मैं एएसपी.नेट एमवीसी 3 पर्यावरण में एंटीटी फ्रेमवर्क 5 के भीतर एक रिकॉर्ड को संपादित / अपडेट करने के विभिन्न तरीकों की खोज कर रहा हूं, लेकिन अब तक उनमें से कोई भी मुझे आवश्यक सभी बॉक्सों पर टिक नहीं लगा रहा है। मैं समझाऊंगा क्यों।

मुझे तीन विधियां मिली हैं जिनके लिए मैं पेशेवरों और विपक्ष का उल्लेख करूंगा:

विधि 1 - मूल रिकॉर्ड लोड करें, प्रत्येक प्रॉपर्टी को अपडेट करें

var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    original.BusinessEntityId = updatedUser.BusinessEntityId;
    original.Email = updatedUser.Email;
    original.EmployeeId = updatedUser.EmployeeId;
    original.Forename = updatedUser.Forename;
    original.Surname = updatedUser.Surname;
    original.Telephone = updatedUser.Telephone;
    original.Title = updatedUser.Title;
    original.Fax = updatedUser.Fax;
    original.ASPNetUserId = updatedUser.ASPNetUserId;
    db.SaveChanges();
}    

पेशेवरों

  • निर्दिष्ट कर सकते हैं कि कौन से गुण बदलते हैं
  • दृश्यों को हर संपत्ति को रखने की आवश्यकता नहीं है

विपक्ष

  • मूल लोड करने के लिए डेटाबेस पर 2 एक्स प्रश्नों को अद्यतन करें

विधि 2 - मूल रिकॉर्ड लोड करें, मूल्यों को सेट करें

var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    db.Entry(original).CurrentValues.SetValues(updatedUser);
    db.SaveChanges();
}

पेशेवरों

  • केवल संशोधित गुण डेटाबेस में भेजे जाते हैं

विपक्ष

  • दृश्यों को प्रत्येक संपत्ति को शामिल करने की आवश्यकता है
  • मूल लोड करने के लिए डेटाबेस पर 2 एक्स प्रश्नों को अद्यतन करें

विधि 3 - अद्यतन रिकॉर्ड संलग्न करें और EntityState को स्थिति सेट करें। संशोधित

db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();

पेशेवरों

  • अद्यतन करने के लिए डेटाबेस पर 1 एक्स क्वेरी

विपक्ष

  • निर्दिष्ट नहीं कर सकते कि कौन से गुण बदलते हैं
  • दृश्यों में प्रत्येक संपत्ति होनी चाहिए

सवाल

आप लोगों से मेरा सवाल; क्या कोई साफ तरीका है कि मैं लक्ष्यों के इस सेट को प्राप्त कर सकता हूं?

  • निर्दिष्ट कर सकते हैं कि कौन से गुण बदलते हैं
  • दृश्यों को प्रत्येक संपत्ति (जैसे पासवर्ड!) रखने की आवश्यकता नहीं है
  • अद्यतन करने के लिए डेटाबेस पर 1 एक्स क्वेरी

मैं समझता हूं कि यह इंगित करने के लिए काफी मामूली बात है लेकिन मुझे इसका एक आसान समाधान याद आ रहा है। यदि विधि नहीं है तो कोई प्रबल होगा ;-)


आपके उपयोग के मामले के आधार पर, उपरोक्त सभी समाधान लागू होते हैं। इस प्रकार मैं आमतौर पर ऐसा करता हूं हालांकि:

सर्वर साइड कोड (उदाहरण के लिए बैच प्रक्रिया) के लिए मैं आमतौर पर इकाइयों को लोड करता हूं और गतिशील प्रॉक्सी के साथ काम करता हूं। आम तौर पर बैच प्रक्रियाओं में आपको सेवा चलाने के समय भी डेटा लोड करने की आवश्यकता होती है। मैं कुछ समय बचाने के लिए खोज विधि का उपयोग करने के बजाय डेटा लोड करने की कोशिश करता हूं। प्रक्रिया के आधार पर मैं आशावादी या निराशावादी समेकन नियंत्रण का उपयोग करता हूं (मैं हमेशा समानांतर निष्पादन परिदृश्यों को छोड़कर आशावादी का उपयोग करता हूं जहां मुझे सादे वर्ग के विवरणों के साथ कुछ रिकॉर्ड लॉक करने की आवश्यकता होती है, हालांकि यह दुर्लभ है)। कोड और परिदृश्य के आधार पर प्रभाव को लगभग शून्य तक घटाया जा सकता है।

ग्राहक पक्ष परिदृश्यों के लिए, आपके पास कुछ विकल्प हैं

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

  2. Wind.js जैसी लाइब्रेरी का उपयोग करें जो इस जटिलता में से अधिकांश को छुपाता है (जैसा कि 1 में वर्णित है) और इसे अपने उपयोग के मामले में फिट करने का प्रयास करें।

आशा करता हूँ की ये काम करेगा


मैंने अपनी रिपॉजिटरी बेस क्लास पर एक अतिरिक्त अद्यतन विधि जोड़ा है जो मचान द्वारा उत्पन्न अद्यतन विधि के समान है। संपूर्ण ऑब्जेक्ट को "संशोधित" पर सेट करने के बजाय, यह अलग-अलग गुणों का एक सेट सेट करता है। (टी एक वर्ग जेनेरिक पैरामीटर है।)

public void Update(T obj, params Expression<Func<T, object>>[] propertiesToUpdate)
{
    Context.Set<T>().Attach(obj);

    foreach (var p in propertiesToUpdate)
    {
        Context.Entry(obj).Property(p).IsModified = true;
    }
}

और फिर कॉल करने के लिए, उदाहरण के लिए:

public void UpdatePasswordAndEmail(long userId, string password, string email)
{
    var user = new User {UserId = userId, Password = password, Email = email};

    Update(user, u => u.Password, u => u.Email);

    Save();
}

मुझे डेटाबेस की एक यात्रा पसंद है। गुणों को दोहराए जाने से बचने के लिए, दृश्य मॉडल के साथ ऐसा करना शायद बेहतर है। मैंने अभी तक ऐसा नहीं किया है क्योंकि मुझे नहीं पता कि मेरे डोमेन प्रोजेक्ट में मेरे व्यू मॉडल वैधताओं पर सत्यापन संदेश लाने से कैसे बचें।


विकल्पों की सूची में जोड़ने के लिए। आप डेटाबेस से ऑब्जेक्ट को भी पकड़ सकते हैं, और उस रिकॉर्ड के हिस्सों को अपडेट करने के लिए ऑटो मैपर जैसे ऑटो मैपिंग टूल का उपयोग कर सकते हैं, जिसे आप बदलना चाहते हैं ..


public interface IRepository
{
    void Update<T>(T obj, params Expression<Func<T, object>>[] propertiesToUpdate) where T : class;
}

public class Repository : DbContext, IRepository
{
    public void Update<T>(T obj, params Expression<Func<T, object>>[] propertiesToUpdate) where T : class
    {
        Set<T>().Attach(obj);
        propertiesToUpdate.ToList().ForEach(p => Entry(obj).Property(p).IsModified = true);
        SaveChanges();
    }
}






entity-framework-5