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

मैं यह जानना चाहता हूं कि किस इकाई प्रकार को अपडेट किया गया है, इसलिए मैं केवल इसके सापेक्ष डेटाग्रिड को अपडेट कर सकता हूं, डीबीसीएन्टेक्स्ट अब इस तरह दिखता है

    public partial class DataEntities : DbContext
    {
        public DataEntities()
            : base("name=DataEntities")
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<Anni> Anni { get; set; }
        public virtual DbSet<Classi> Classi { get; set; }
        public virtual DbSet<ClassiConcorso> ClassiConcorso { get; set; }
        public virtual DbSet<Discipline> Discipline { get; set; }
        public virtual DbSet<Docenti> Docenti { get; set; }
        public virtual DbSet<Indirizzi> Indirizzi { get; set; }
        public virtual DbSet<Sedi> Sedi { get; set; }
        public virtual DbSet<SistemaOrario> SistemaOrario { get; set; }
        public virtual DbSet<VisualizzaClassi> VisualizzaClassi { get; set; }
        public virtual DbSet<VisualizzaDocenti> VisualizzaDocenti { get; set; }
        public virtual DbSet<VisualizzaSistemaOrario> VisualizzaSistemaOrario { get; set; }
        public virtual DbSet<VisualizzaTotaleOre> VisualizzaTotaleOre { get; set; }
        public virtual DbSet<VisualizzaTotaleOrePerClasseConcorso> VisualizzaTotaleOrePerClasseConcorso { get; set; }

        public event EventHandler SavingMultipleChanges;
        public event EventHandler SavingAnniChanges;
        public event EventHandler SavingClassiChanges;
        public event EventHandler SavingClassiConcorsoChanges;
        public event EventHandler SavingDisciplineChanges;
        public event EventHandler SavingDocentiChanges;
        public event EventHandler SavingIndirizziChanges;
        public event EventHandler SavingSediChanges;
        public event EventHandler SavingSistemaOrarioChanges;

        public override int SaveChanges()
        {
            // Notify objects that want to know, that we are gonna save some stuff
            IEnumerable<DbEntityEntry> changes = this.ChangeTracker.Entries().Where(t => t.State != EntityState.Unchanged);
            if (changes.Count() == 1)
            {
                var change = changes.ElementAt(0);
                if (change.Entity.GetType() == Anni.Create().GetType())
                {
                    SavingAnniChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == Sedi.Create().GetType())
                {
                    SavingClassiChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == ClassiConcorso.Create().GetType())
                {
                    SavingClassiConcorsoChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == Discipline.Create().GetType())
                {
                    SavingDisciplineChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == Docenti.Create().GetType())
                {
                    SavingDocentiChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == Indirizzi.Create().GetType())
                {
                    SavingIndirizziChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == Sedi.Create().GetType())
                {
                    SavingSediChanges.Invoke(this, new EventArgs());
                }
                if (change.Entity.GetType() == SistemaOrario.Create().GetType())
                {
                    SavingSistemaOrarioChanges.Invoke(this, new EventArgs());
                }
            }
            else
            {
                SavingMultipleChanges.Invoke(this, new EventArgs());
            }

            // Call the actual SaveChanges method to apply the changes to the database
            return base.SaveChanges();
        }
    }

तो यह काम करता है, क्या ऐसा करने का कोई कट्टर तरीका है?

ध्यान दें कि यह संस्करण 0 है, अगला एक एकल ईवेंट होगा जो EventArgs के माध्यम से प्रकारों को पारित करेगा

0
Daniel Martin 22 अक्टूबर 2020, 12:33

1 उत्तर

सबसे बढ़िया उत्तर

यह प्रतिबिंब के माध्यम से संभव है, लेकिन आपको यह सुनिश्चित करना होगा कि प्रत्येक घटना का नाम एकल पैटर्न से मेल खाता हो

var change = changes.ElementAt(0);

var entityType = change.Entity.GetType();
var eventDelegate = (Delegate)GetType()
    .GetField("Saving" + entityType.Name + "Changes", BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(this);

if (eventDelegate != null)
{
    eventDelegate.DynamicInvoke(this, EventArgs.Empty);
}
else 
{
    throw new NotImplementedException("Event handler not implemented for type " + entityType.Name);
}

बाद में आप अपने ईवेंट को पास करने के लिए कुछ सामान्य ईवेंट हैंडलर तर्क बना सकते हैं

public class GenericEventArgs<T> : EventArgs
{
    public T Item { get; set; }
}

और उदाहरण बनाने के लिए कोड

var eventArgsType = typeof(GenericEventArgs<>).MakeGenericType(entityType);
var eventArgs = Activator.CreateInstance(eventArgsType);
eventArgsType.GetProperty("Item").SetValue(eventArgs, change);
0
Yegor Androsov 22 अक्टूबर 2020, 15:04