Я новичок в Entity Framework, в прошлом я использовал Enterprise Library или ADO.NET напрямую, чтобы сопоставлять модели с таблицами базы данных. Один шаблон, который я использовал, состоит в том, чтобы поместить мои общие поля аудита в каждую таблицу базового класса, а затем наследовать этот базовый класс для каждого объекта.Код структуры Entity Framework Первые общие поля аудита базы данных
Я два шага для защиты двух полей (Created, CreatedBy):
- Have без параметров конструктор приватным на базе Enitity и создать второй, который требует Created и CreatedBy передаются по созданию.
- Сделать сеттеры приватными, чтобы значения не могли быть изменены после создания объекта.
Базовый класс:
using System;
namespace App.Model
{
[Serializable()]
public abstract class BaseEntity
{
public bool IsActive { get; private set; }
public DateTimeOffset Created { get; private set; }
public string CreatedBy { get; private set; }
public DateTimeOffset LastUpdated { get; protected set; }
public string LastUpdatedBy { get; protected set; }
private BaseEntity() { }
protected BaseEntity(DateTimeOffset created, string createdBy)
{
IsActive = true;
Created = created;
CreatedBy = createdBy;
LastUpdated = created;
LastUpdatedBy = createdBy;
}
}
}
Наследуется Класс:
using System;
namespace App.Model
{
[Serializable()]
public class Person : BaseEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Person(DateTimeOffset created, string createdBy) :
base(created, createdBy) { }
}
}
Я столкнулся с проблемами с обоими. Для создания объектов EF требует конструктор без параметров. EF не будет создавать столбцы базы данных, у которых есть собственный сеттер.
Мой вопрос, если есть лучший подход для достижения своих целей с EF:
- Требуют, что значения для создания и CreatedBy заполняются в конкретизации.
- Значения Created и CreatedBy не могут быть изменены.
Существует еще один вариант: переопределить 'SaveChanges' в вашем контексте и выполнять все связанные с аудитом действия (установить дату создания для новых объектов, установить дату изменения для обновленных объектов и т. Д.). Все это будет сделано перед сохранением. –
[У меня была такая же проблема и я нашел это полезным.] (Http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit- logging /) –
Вместо этого я бы реализовал интерфейс «IAuditiable», таким образом вы все еще можете иметь объекты, которые не должны быть проверены, и те, которые должны быть реализованы с помощью логики, специфичной для этого интерфейса в вашем вызове SaveChanges(), как это предлагается в одном из ответы ниже, если это то, что вы хотите. – FRoZeN