Entity Framework 4, Пользовательские свойства.Добавить некоторые черты - PullRequest
2 голосов
/ 12 сентября 2010

У меня есть класс Address, сгенерированный сущностью Framework.У меня есть AddressID свойства в этом классе.

Я хотел бы иметь возможность добавить некоторое лечение для этой опоры в заданном процессе.EX:

  public partial class Address
  {
       public bool _AddressID;
       public bool AddressID{get return AddressID;}
       set{
            if(value == -1) _AddressID = null;
       }
   }

Спасибо

Ответы [ 2 ]

2 голосов
/ 13 сентября 2010

Конечно, вы не можете переопределить свой AddressID для того, чтобы поместить свою пользовательскую логику в установщик, так как вы получите ошибку компилятора:
Тип Address уже содержит определение для 'AddressID'

Но не беспокойтесь, если вы посмотрите на сгенерированный EF-код для вашего EntityObject (давайте предположим, что его имя - Address), вы увидите, что каждое скалярное свойство сгенерированного класса Address имеет свою собственную версию OnPropertyChanging и OnPropertyChanged метод. Например, OnAddressIDChanging и OnAddressIDChanged в этом случае.

Как вы можете видеть ниже, для этих двух методов нет реализации по умолчанию, только декларация. Это прекрасно дает вам возможность выполнить пользовательскую логику так как свойство собирается изменить (PropertyChanging), а также сразу после свойства значение изменилось (PropertyChanged).

// From the designer code for Address class:
partial void OnAddressIDChanging(global::System.Int32 value);
partial void OnAddressIDChanged();


Вот как выглядит ваш код конструктора Entity Model (гипотетически):

public global::System.Int32 AddressID {
    get {
        return _AddressID;
    }
    set {
        if (_AddressID != value) {
            // OnPropertyChanging method get called here:
            OnAddressIDChanging(value);

            ReportPropertyChanging("AddressID");
            _AddressID = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("AddressID");

            // OnPropertyChanged get called here:
            OnAddressIDChanged();
        }
    }
}


Итак, все, что вам нужно сделать, чтобы подключить свой код:

public partial class Address {
    partial void OnAddressIDChanged() {
        if(AddressID == -1) {            
            AddressID = 0;
        }
    }       
}



Кстати, о других опубликованных ответах - при всем их уважении - если вы хотите использовать это решение для производственного приложения, то вы не можете использовать «Code First», поскольку это просто CTP на данный момент и будет частью следующего выпуска для EF, так что это не может быть вариантом.
О настройке генерации кода по умолчанию, хотя это действительно возможно, поскольку в VS 2010 сама Entity Framework также использует T4 для генерации кода дизайнера, и мы можем воспользоваться этим, изменив T4, но это вариант, только если вы хотите фундаментально изменить как классы сущностей генерируются в целом, и вы не можете использовать их для настройки логики установки для конкретной сущности.

0 голосов
/ 13 сентября 2010

Code First в EF4 - это опция - она ​​позволяет вам полностью контролировать весь код. Однако другой вариант заключается в настройке шаблонов EF4 T4, которые поставляются с EF4. Если в вашем коде есть определенные шаблоны, которые вы постоянно используете, это будет хорошим подходом. Подробнее о настройке шаблонов можно прочитать здесь: Настройка классов сущностей в VS2010

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...