none
liq2sql datacontext association - SendPropertyChanging RRS feed

  • Общие обсуждения

  • Доброго!

    Использую Visual Studio 2010 premium, создаю схему linq2sql, две таблицы с ассоциацией. Свойства появляются, все в порядке.

    Сделал расширение для одной сущности - добавил файл с partial  классом. Пытаюсь добавить в этот класс некоторую логику. В частности, хочу поймать событие перед изменением свойства (которое создано ассоциацией)

    Для тех свойств сущности, которые не-ассоциации, есть методы partial void On[field_name]Changing и On[field_name]Changed

    Для ассоциаций таких событий нет. Более того, событие PropertyChanging сущности не передает в обработчик события OnChanging не то, что нового значения (что было бы весьма кстати), но даже имени того свойства, которое будет меняться.

    Для иллюстрации, приведу сгенерированный студией код:

    [global::System.Data.Linq.Mapping.AssociationAttribute(Name="project_composition_s_Registr", Storage="_ProjectComposition", ThisKey="ID_SostavPr", OtherKey="id", IsForeignKey=true)] public project_composition ProjectComposition { get { return this._ProjectComposition.Entity; } set { project_composition previousValue = this._ProjectComposition.Entity; if (((previousValue != value) || (this._ProjectComposition.HasLoadedOrAssignedValue == false))) {

    //Вот неужели здесь нельзя было написать нечто вроде

    //this.SendPropertyChanging("ProjectComposition")???

    this.SendPropertyChanging(); if ((previousValue != null)) { this._ProjectComposition.Entity = null; previousValue.Records.Remove(this); } this._ProjectComposition.Entity = value; if ((value != null)) { value.Records.Add(this); this._ID_SostavPr = value.id; } else { this._ID_SostavPr = default(Nullable<int>); }

    //А здесь это, почему-то, вполне себе возможно :) this.SendPropertyChanged("ProjectComposition"); } } }


    в итоге, если я подписываюсь на событие моей сущности

    partial void OnCreated()
    {
                
    	this.PropertyChanging += new System.ComponentModel.PropertyChangingEventHandler(s_Registr_PropertyChanging);
    }
    И попытаюсь выполнить код при обновлении именно этой ассоциации, меня ждет разочарование
    void s_Registr_PropertyChanging(object sender, System.ComponentModel.PropertyChangingEventArgs e)
            {
                switch (e.PropertyName)
                {
                    case "ProjectComposition":
                        //Никогда сюда не попадает, ибо e.PropertyName === String.Empty
                        break;
                }
            }

    А вот код, использующий контекст:

    using (var db = new DocsInsideDataContext()) { long regId = 201564; var reg = db.s_Registrs.First(r => r.ID_Reg == regId); var cmp = db.project_compositions.First(c => c.id == 25378);

    // Вот это событие я хочу обработать в моем классе reg.ProjectComposition = cmp; }


    каким образом я могу этого достичь?

    23 ноября 2012 г. 10:31