2013-05-15 8 views
10

पर ट्रिगर का उपयोग करने के बाद मैंने संलग्न लिंक में एक प्रश्न पढ़ने के बाद, मुझे एंटिटी फ्रेमवर्क में डेटक्रेटेड और डेटमोडिफाइड कॉलम सेट करने और मेरे एप्लिकेशन में इसका उपयोग करने का एहसास हुआ। हालांकि पुराने एसक्यूएल तरीके में, ट्रिगर रास्ता अधिक लोकप्रिय है क्योंकि डीबीए बिंदु से अधिक सुरक्षित है।डेटक्रेटेड या संशोधित कॉलम - इकाई फ्रेमवर्क या SQL सर्वर

तो किसी भी सलाह से सबसे अच्छा अभ्यास किस तरह से है? इसे एप्लिकेशन अखंडता के उद्देश्य के लिए इकाई ढांचे में सेट किया जाना चाहिए? या ट्रिगर का उपयोग करना चाहिए क्योंकि यह डेटा सुरक्षा बिंदु से अधिक समझ में आता है? या इकाई ढांचे में ट्रिगर लिखने का कोई तरीका है? धन्यवाद।

EF CodeFirst: Rails-style created and modified columns

Btw, भले ही यह नहीं ज्यादा बात, मैं इस एप्लिकेशन का उपयोग ASP.NET MVC सी # का निर्माण कर रहा हूँ है।

उत्तर

20

राय: ट्रिगर, जैसे छिपा व्यवहार कर रहे हैं जब तक आप उन्हें तलाश में जाने के लिए आप आमतौर पर पता ही नहीं होगा कि वे कर रहे हैं। मैं ईएफ का उपयोग करते समय डीबी को जितना संभव हो उतना 'गूंगा' रखना पसंद करता हूं, क्योंकि मैं ईएफ का उपयोग कर रहा हूं इसलिए मेरी टीम को एसक्यूएल कोड बनाए रखने की आवश्यकता नहीं है।

(एक अन्य परियोजना है कि यह भी DataContext शामिल में सी # में व्यापार तर्क के साथ ASP.NET WebForms और MVC के मिश्रण) मेरे समाधान के लिए:

मैं हाल ही में एक ऐसी ही मुद्दा था, और मेरी स्थिति के लिए हालांकि यह अधिक जटिल था (डाटाबेस फर्स्ट, इसलिए एक कस्टम टीटी फ़ाइल की आवश्यकता है), समाधान ज्यादातर वही है।

मैं एक अंतरफलक बनाया:

public interface ITrackableEntity 
{ 
    DateTime CreatedDateTime { get; set; } 
    int CreatedUserID { get; set; } 
    DateTime ModifiedDateTime { get; set; } 
    int ModifiedUserID { get; set; } 
} 

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

अद्यतन: यहाँ टीटी फ़ाइल है, जहां मैं EntityClassOpening() विधि अपडेट करने के लिए अपने परिवर्तन है:

public string EntityClassOpening(EntityType entity) 
{ 
    var trackableEntityPropNames = new string[] { "CreatedUserID", "CreatedDateTime", "ModifiedUserID", "ModifiedDateTime" }; 
    var propNames = entity.Properties.Select(p => p.Name); 
    var isTrackable = trackableEntityPropNames.All(s => propNames.Contains(s)); 
    var inherits = new List<string>(); 
    if (!String.IsNullOrEmpty(_typeMapper.GetTypeName(entity.BaseType))) 
    { 
     inherits.Add(_typeMapper.GetTypeName(entity.BaseType)); 
    } 
    if (isTrackable) 
    { 
     inherits.Add("ITrackableEntity"); 
    } 

    return string.Format(
     CultureInfo.InvariantCulture, 
     "{0} {1}partial class {2}{3}", 
     Accessibility.ForType(entity), 
     _code.SpaceAfter(_code.AbstractOption(entity)), 
     _code.Escape(entity), 
     _code.StringBefore(" : ", String.Join(", ", inherits))); 
} 

केवल एक चीज छोड़ दिया मेरी आंशिक DataContext वर्ग के लिए निम्न जोड़ने के लिए किया गया था:

public override int SaveChanges() 
    { 
     // fix trackable entities 
     var trackables = ChangeTracker.Entries<ITrackableEntity>(); 

     if (trackables != null) 
     { 
      // added 
      foreach (var item in trackables.Where(t => t.State == EntityState.Added)) 
      { 
       item.Entity.CreatedDateTime = System.DateTime.Now; 
       item.Entity.CreatedUserID = _userID; 
       item.Entity.ModifiedDateTime = System.DateTime.Now; 
       item.Entity.ModifiedUserID = _userID; 
      } 
      // modified 
      foreach (var item in trackables.Where(t => t.State == EntityState.Modified)) 
      { 
       item.Entity.ModifiedDateTime = System.DateTime.Now; 
       item.Entity.ModifiedUserID = _userID; 
      } 
     } 

     return base.SaveChanges(); 
    } 

ध्यान दें कि मैंने प्रत्येक उपयोगकर्ता द्वारा बनाए गए डेटाकॉन्टेक्स्ट क्लास पर एक निजी फ़ील्ड में वर्तमान उपयोगकर्ता आईडी को सहेजा था।

+0

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

+1

मैं ईएफ टीम का स्वागत करता हूं कि यह सरल नियमों के लिए चीजों को आसान बना देगा। उस ने कहा, नियमों के लिए अक्सर अपवाद होते हैं, इसलिए प्रक्रिया के पूर्ण नियंत्रण को कैसे लेना सीखना सीखना एक मूल्यवान कौशल है। –

+0

सटीक रूप से आपने टीटी फ़ाइल में कौन से अपडेट किए हैं? – Fergal

6

DateCreated का सवाल है, मैं सिर्फ एक डिफ़ॉल्ट बाधाSYSDATETIME() को उस स्तंभ सेट जब तालिका में एक नई पंक्ति डालने कि प्रभावी होता है पर जोड़ना होगा।

DateModified के लिए, व्यक्तिगत रूप से, मैं शायद उन तालिकाओं पर ट्रिगर्स का उपयोग करता हूं।

मेरी राय में, ट्रिगर दृष्टिकोण:

  • यह आसान बनाता है; मैं के बारे में चिंता और हर बार याद है कि मैं स्थापित करने के लिए है कि DateModified

  • यह "सुरक्षित" में यह भी DateModified अगर किसी को अपने आवेदन में डेटा को संशोधित करने के चारों ओर एक रास्ता पाता लागू होगी बनाता है एक इकाई को बचाने के लिए की जरूरत नहीं है डेटाबेस सीधे (जैसे एक्सेस या एक्सेल या कुछ का उपयोग कर)।

+0

मैं पहले कोड का उपयोग कर रहा हूं, इसलिए डीबी-माइग्रेशन में एक ट्रिगर बनाया जा सकता है। हालांकि कॉलम में डिफ़ॉल्ट बाधा जोड़ने के लिए, मुझे नहीं लगता कि मैं डीबी माइग्रेशन या डेटा एनोटेशन के माध्यम से ऐसा कर सकता हूं, क्या मैं कर सकता हूं? – anIBMer

3

इकाई फ्रेमवर्क 6 में इंटरसेप्टर हैं जिनका उपयोग और संशोधित सेट करने के लिए किया जा सकता है। - ज्यादा सुरक्षित डेटाबेस में ट्रिगर (रों) के लिए http://marisks.net/2016/02/27/entity-framework-soft-delete-and-automatic-created-modified-dates/

2

मैं marc_s से सहमत: मैं एक लेख इसे कैसे करना लिखा था। मेरी कंपनी के डेटाबेस में, मुझे प्रत्येक फ़ील्ड को Date_Modified, Date_Created फ़ील्ड की आवश्यकता होती है, और मेरे पास आवश्यक ट्रिगर स्वचालित रूप से बनाने के लिए एक उपयोगिता फ़ंक्शन भी है।

जब इकाई की रूपरेखा के साथ का उपयोग कर, मैंने पाया कि मैं अपने POCO वर्गों के साथ [DatabaseGenerated] एनोटेशन का उपयोग करने की जरूरत:

[Column(TypeName = "datetime2")] 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public DateTime? Date_Modified { get; set; } 

[Column(TypeName = "datetime2")] 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public DateTime? Date_Created { get; set; } 

मैं एक इकाई पर संग्रहीत प्रक्रिया मानचित्रण उपयोग करने का प्रयास किया गया था, और एफई @Date_Modified निर्माण कर रहा है , @Date_Created मेरे डालने/अद्यतन स्पॉक्स पर पैरामीटर त्रुटि प्राप्त करने के लिए

प्रक्रिया या फ़ंक्शन में बहुत से तर्क निर्दिष्ट हैं।

उदाहरण के अधिकांश [NotMapped], जो चयन की अनुमति देगा का उपयोग कर दिखाने/काम करने के लिए सम्मिलित है, लेकिन फिर वे फ़ील्ड दिखाई नहीं देंगे जब उस संस्था भरी हुई है!

वैकल्पिक रूप से आप यह सुनिश्चित कर सकते हैं कि किसी भी स्पॉक्स में @Date_Modified, @Date_Created पैरामीटर शामिल हैं, लेकिन यह पहली जगह ट्रिगर्स का उपयोग करने के डिज़ाइन के खिलाफ चला जाता है।

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