राय: ट्रिगर, जैसे छिपा व्यवहार कर रहे हैं जब तक आप उन्हें तलाश में जाने के लिए आप आमतौर पर पता ही नहीं होगा कि वे कर रहे हैं। मैं ईएफ का उपयोग करते समय डीबी को जितना संभव हो उतना 'गूंगा' रखना पसंद करता हूं, क्योंकि मैं ईएफ का उपयोग कर रहा हूं इसलिए मेरी टीम को एसक्यूएल कोड बनाए रखने की आवश्यकता नहीं है।
(एक अन्य परियोजना है कि यह भी 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();
}
ध्यान दें कि मैंने प्रत्येक उपयोगकर्ता द्वारा बनाए गए डेटाकॉन्टेक्स्ट क्लास पर एक निजी फ़ील्ड में वर्तमान उपयोगकर्ता आईडी को सहेजा था।
यह एक अच्छी तरह से विस्तृत उत्तर दिया गया है, धन्यवाद टिम। मैं आपके रास्ते से आश्वस्त हूं और आवेदन तर्क में इस तर्क को बनाए रखना अच्छा है। क्या आपको लगता है कि ईएफ टीम के लिए डिफ़ॉल्ट बाधाओं को जोड़ने और डेटा एनीोटेशन या फ्लुएंटैपी में समर्थन ट्रिगर करना संभव या सार्थक है? – anIBMer
मैं ईएफ टीम का स्वागत करता हूं कि यह सरल नियमों के लिए चीजों को आसान बना देगा। उस ने कहा, नियमों के लिए अक्सर अपवाद होते हैं, इसलिए प्रक्रिया के पूर्ण नियंत्रण को कैसे लेना सीखना सीखना एक मूल्यवान कौशल है। –
सटीक रूप से आपने टीटी फ़ाइल में कौन से अपडेट किए हैं? – Fergal