Я начинаю знать и работать с 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();
}
}
С уважением.