EF 4.3 и POCO классы - где перехватить значение свойства? - PullRequest
3 голосов
/ 05 марта 2012

Я начинаю знать и работать с Entity Framework.И я пытаюсь сделать несколько простых всплесков, чтобы узнать, как это работает.

Мой первый вопрос - как правильно перехватить значения из клиентского интерфейса и изменить их, прежде чем сохранять их.

Например, у нас есть эта модель Person, автоматически сгенерированная шаблоном EF 4.x DbContext Generator:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

namespace EFModelDatabaseFirst
{
    public partial class Person
    {
        #region Primitive Properties        
        public virtual int Id { get; set; }        
        public virtual string FullName { get; set; }       
        public virtual string LastName { get; set; }
        #endregion
    }
}

Я бы хотел изменить установщик FullName на всегда установить его в UpperCase.Например, следующим образом:

public partial class Person
{
    private string fullname;

    #region Primitive Properties        
    public virtual int Id { get; set; }        
    public virtual string FullName { 
        get { return fullname; } 
        set { fullname = value.ToUpper(); }       
    public virtual string LastName { get; set; }
    #endregion
}

Но я должен продолжить работу над моделью, и когда я снова выполню «Добавить элемент генерации кода ...» из этой модифицированной модели, все мои рукописные модификации будутпотерян, когда шаблон переписывает все файлы.

Каков наилучший подход для реализации этого?

Спасибо.

edit:

=== ОТВЕТ ОТ @Codeulike ===

, если я попытаюсь создать частичный класс следующим образом:

public partial class Person
{
    partial void OnFullNameChanging(string value)
    {
        this.FullName = value.ToUpper();
    }
}

Тогда у меня есть цикл Infinite и, таким образом, исключение stackoverflow.И я должен удалить классы POCO и активировать model.edmx с помощью Code Generation Strategy: по умолчанию

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

public partial class Person
{
    private string fullname;

    partial string FullName
    {
        get
        {
            return fullname;
        }
        set
        {
            fullname = value.ToUpper();
        }
    }
}

Компилятор выдает мне ошибку, потому что Class Person уже содержит определение для «FullName».

Единственный способ заставить его работать нормально - это удалить свойство в POCO Class Person.Но если я заново сгенерирую классы POCO, все изменения будут потеряны.

edit:

=== ОТВЕТ ОТ @Codeulike + @Guvante добавлений ===

Наконец-то я создал частичный класс следующим образом:

public partial class Person
{
    partial void OnFullNameChanging(string value)
    {
        // _FullName is the backend field EF generates.
        this._FullName = value.ToUpper();
    }
}

, но он не запускается и значение FullName (для базы данных) не изменяется на UpperCase,Я должен был сделать по-другому, и он работает нормально:

public partial class Person
{
    partial void OnFullNameChanged()
    {
        this._FullName = this.FullName.ToUpper();
    }
}

С уважением.

1 Ответ

0 голосов
/ 05 марта 2012

Сгенерированные классы сущностей Частичные классы .

Вы можете создавать свои биты в отдельных файлах .cs, и все они будут скомпилированы вместе. Это позволяет добавлять материал, не перезаписывая его генератором кода.

Подробнее см. здесь .

edit: ок, я вижу вашу проблему с геттерами и сеттерами. Видимо, это способ сделать это:

Как выполнить бизнес-логику при скалярных изменениях свойств
http://msdn.microsoft.com/en-us/library/cc716747.aspx

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

, например

partial void OnFullNameChanged()
{
    // this partial method gets called when the FullName property has changed
}

edit: платформа Entity использует закрытые поля внутри открытых свойств для хранения значений. Они обычно называются _<property name> - проверьте ваш сгенерированный код, чтобы увидеть, что он использует. Таким образом, код заглавной буквы FullName будет выглядеть примерно так:

partial void OnFullNameChanged()
{
    _FullName = _FullName.ToUpper();
}
...