Как добавить значения по умолчанию к свойству при сохранении с использованием Code First EF4.1? - PullRequest
10 голосов
/ 31 марта 2011

Я начал с создания некоторых моделей, таких как:

public abstract class EditableBase
{
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }

    public int CreatedBy { get; set; }
    public int ModifiedBy { get; set; }
}

public class Project : EditableBase
{
    public int ProjectId { get; set; }
    public string ProjectName { get; set; }
}

И я использую эту строку при запуске приложения:

Database.SetInitializer<ModelContext>(
            new DropCreateDatabaseIfModelChanges<ModelContext>());

Создается таблица Projects со всеми свойствамиупоминалось выше как столбцы ... это именно то, что я хотел.

Однако теперь мне нужно заполнить некоторые значения по умолчанию, когда я запускаю SaveChanges () для DbContext.Когда я сохраняю, мне нужно обновить свойства ModifiedOn и ModifiedBy соответствующими значениями.

Обычно я бы, по крайней мере, делал бы значения DateTime на стороне базы данных (либо триггер, либо хранимая процедура), однако это явно неопция здесь, так как база данных будет удалена при каждом изменении класса.И так как я сначала написал код, у меня нет дизайнера модели, для которого я могу настроить свойства.

Я хотел бы добавить метод в классе EditableBase, который вызывается, когда SaveChanges ()выполняется, таким образом, сохраняя всю логику в одном месте.Можно ли сделать это?Как лучше всего достичь своей цели?

Ответы [ 3 ]

8 голосов
/ 31 марта 2011

Переопределить SaveChanges в вашем производном DbContext:

public override int SaveChanges()
{
    foreach(var entry in ChangeTracker.Entries<EditableBase>())
    {
        var entity = entry.Entity;
        if (entry.State == EntityState.Added)
        {
            entity.CreatedOn = ...;
            entity.CreatedBy = ...;
        }
        else if (entry.State == EntityState.Modified)
        {
            entity.ModifiedOn = ...;
            entity.ModifiedBy = ...;
        }
    }

    return base.SaveChanges();
}

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

0 голосов
/ 14 мая 2011

Рассматривали ли два варианта в этом посте , где вы что-то делаете с установщиком (или конструктором)?

Хорошее решение по умолчанию для атрибутов.

0 голосов
/ 31 марта 2011

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

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