Как использовать разделяемый класс, чтобы установить для дочернего свойства ассоциации значение false

У меня есть база данных, которая сильно меняется, и мне постоянно приходится заходить в конструктор контекста данных и вручную устанавливать для ряда дочерних свойств ассоциаций значение false. Каждый раз, когда я удаляю таблицу из дизайнера, мне приходится возвращаться и переделывать все ассоциации.

Есть ли способ использовать частичный класс для определения дочернего свойства ассоциации, скажем, объекта с именем Company, который имеет отношение один ко многим к объекту с именем Program?

Я надеюсь, что смогу просто изменить дочернее свойство ассоциации в коде, чтобы каждый раз, когда сущность удаляется из контекста данных и повторно добавляется, мне не приходилось проходить весь процесс снова.

Спасибо за любую помощь!


person ps_md    schedule 03.12.2012    source источник


Ответы (2)


Я смотрел этот вопрос, надеясь, что у кого-то есть новости для вас получше, чем у меня. Фактически вы можете добавить частичный класс в то же пространство имен, что и ваш контекст, и внутри него определить новое имя для дочернего свойства/коллекции (так раздражает, что он повторно генерируется как User1, User2, User3, когда вы определили его как OpenedBy, ApprovedBy и ClosedBy или что-то подобное).

Это помогает получить доступ к свойствам по более понятному имени, как вы сказали выше; однако я еще не нашел способа в этом частичном классе определить свойство таким образом, чтобы оно поддерживало все свойства (каламбур не предназначен) свойств навигации Entity Framework с полной функциональностью чтения/записи.

Это не решает вашу проблему, но, насколько я знаю, это точный ответ; Я пошел дальше и просто согласился с тем, что мне придется переименовывать свойства навигации в EDMX в случае, если мне нужно удалить/повторно добавить объект.

person Rick Petersen    schedule 05.12.2012
comment
Я исследовал это некоторое время и в конечном итоге пришел к выводу, что мне просто нужно с этим справиться. Самая большая проблема в основном заключается в запоминании того, какие свойства ассоциаций были изменены, чтобы я мог вернуть их после того, как объект был удален и добавлен обратно. - person ps_md; 06.12.2012
comment
Я полностью согласен. В итоге я либо храню электронный список, либо скриншоты дизайнера edmx, если модель достаточно мала, чтобы ее можно было разборчиво разместить на одном экране. - person Rick Petersen; 06.12.2012

У меня такая же проблема... и тоже не нашел решения.

Тем не менее, у меня есть некоторая информация для людей, которые изучают это:

Когда для ChildProperty установлено значение false, заменяется файл .designer.cs (вместо файлов .dbml/.dbml.layout). Вот пример...

ChildProperty=true:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="bank_account_bank_payment_file", Storage="_bank_account", ThisKey="company_bank_account_id", OtherKey="bank_account_id", IsForeignKey=true)]
public bank_account bank_account
{
    get
    {
        return this._bank_account.Entity;
    }
    set
    {
        bank_account previousValue = this._bank_account.Entity;
        if (((previousValue != value) 
                || (this._bank_account.HasLoadedOrAssignedValue == false)))
        {
            this.SendPropertyChanging();
            if ((previousValue != null))
            {
                this._bank_account.Entity = null;
                previousValue.bank_payment_files.Remove(this);
            }
            this._bank_account.Entity = value;
            if ((value != null))
            {
                value.bank_payment_files.Add(this);
                this._company_bank_account_id = value.bank_account_id;
            }
            else
            {
                this._company_bank_account_id = default(int);
            }
            this.SendPropertyChanged("bank_account");
        }
    }
}

ChildProperty=false:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="bank_file_handler_bank_payment_file", Storage="_bank_file_handler", ThisKey="bank_file_handler_id", OtherKey="bank_file_handler_id", IsForeignKey=true)]
[global::System.Runtime.Serialization.DataMemberAttribute(Order=17, EmitDefaultValue=false)]
public bank_file_handler bank_file_handler
{
    get
    {
        if ((this.serializing 
                    && (this._bank_file_handler.HasLoadedOrAssignedValue == false)))
        {
            return null;
        }
        return this._bank_file_handler.Entity;
    }
    set
    {
        if ((this._bank_file_handler.Entity != value))
        {
            this.SendPropertyChanging();
            this._bank_file_handler.Entity = value;
            this.SendPropertyChanged("bank_file_handler");
        }
    }
}
person Christian    schedule 14.10.2013