ठीक है, मैं इस पर खरगोश की मांद नीचे पूरी तरह से चले गए हैं, लेकिन मुझे लगता है कि मैं एक बहुत अच्छा समाधान है:
पहले, अपने डेटा संदर्भ के लिए एक ईवेंट हैंडलर जोड़ने के उस पोस्ट की सभी एकत्रित करेगा संकेतों को बचाएं और Dispose
विधि को छुपाएं ताकि हम निपटने से पहले हम ईवेंट को सही तरीके से कॉल कर सकें। (ध्यान दें कि मैं override
के बजाय new
कीवर्ड का उपयोग करें। इस घटना को संभव बुला बना देता है।)
partial class MyDataContext
{
internal delegate void PostSaveHandler();
internal event PostSaveHandler PostSave;
// This method hides the underlying Dispose because we need to call PostSave.
public new void Dispose(bool disposing)
{
// Obviously necessary error handling omitted for brevity's sake
PostSave();
base.Dispose(disposing);
}
}
इसके बाद, एक T4 Template कि dbml
फ़ाइल कि LINQ एसक्यूएल के लिए आपके लिए बनाए गए निरीक्षण में लिखें।
<#
var dbml = XDocument.Load(@"MyDataContext.dbml");
var name = XName.Get("Type", "http://schemas.microsoft.com/linqtosql/dbml/2007");
var tables = from t in dbml.Descendants(name) select t.Attribute("Name").Value;
foreach(var table in tables)
{
#>
...
डेटाबेस (और इस प्रकार प्रत्येक आंशिक वर्ग) में प्रत्येक तालिका के लिए, निम्न विधियों के साथ आंशिक में जोड़ें।
public partial class Foo
{
internal void OnInsert(MyDataContext db) {
PreInsert();
db.PostSave += delegate { PostInsert(); };
}
internal void OnUpdate(MyDataContext db) {
PreUpdate();
db.PostSave += delegate { PostUpdate(); };
}
internal void OnDelete(MyDataContext db) {
PreDelete();
db.PostSave += delegate { PostDelete(); };
}
partial void PreInsert();
partial void PostInsert();
partial void PreUpdate();
partial void PostUpdate();
partial void PreDelete();
partial void PostDelete();
}
// repeat for all tables
टी 4 के माध्यम से एक और partial MyDataContext
भी जोड़ें। यह आंशिक तरीकों के लिए परिभाषाओं को जोड़ देगा जो लिंक से एसक्यूएल आपको देता है (जैसा कि मेरिट का उल्लेख है)।
public partial class MyDataContext
{
// Add these three partial methods for each table
partial void InsertFoo(Foo foo)
{
foo.OnInsert(this);
ExecuteDynamicInsert(foo);
}
partial void UpdateFoo(Foo foo)
{
foo.OnUpdate(this);
ExecuteDynamicUpdate(foo);
}
partial void DeleteFoo(Foo foo)
{
foo.OnDelete(this);
ExecuteDynamicDelete(foo);
}
// ...
}
उन फ़ाइलों को कहीं और सुरक्षित से छुपाएं, इसलिए कोई भी उनके साथ गड़बड़ करने की कोशिश नहीं करता है।
आपके सिग्नल ढांचे की स्थापना की गई है। अब आप अपने सिग्नल लिख सकते हैं। Foo.cs
में या सभी को एक साथ एक Signals.cs
फ़ाइल में या तो इन रखो:
partial class Foo
{
partial void PostInsert()
{
EventLog.AddEvent(EventType.FooInserted, this);
}
}
इसमें कुछ समय जटिल है, इसलिए यदि कुछ भी मतलब नहीं है, एक टिप्पणी छोड़ और मैं इसे संबोधित करने की मेरी पूरी कोशिश करेंगे कृपया। ओवरराइड SubmitChanges (ConflictMode failureMode):