Tôi mới dùng Entity Framework, trước đây tôi đã sử dụng Enterprise Library hoặc ADO.NET trực tiếp để ánh xạ các mô hình tới các bảng cơ sở dữ liệu. Một mẫu mà tôi đã sử dụng là đặt các trường kiểm toán chung của tôi xuất hiện trong mỗi bảng trong một Lớp cơ sở và sau đó kế thừa Lớp cơ sở đó cho mọi đối tượng.Mã khung thực thể Cơ sở dữ liệu chung đầu tiên
Tôi mất hai bước để bảo vệ hai trong số các lĩnh vực (Created, CreatedBy):
- Có một tin constructor parameterless trên Enitity cơ sở và tạo một thứ hai mà đòi hỏi phải tạo và CreatedBy được thông qua vào sáng tạo.
- Đặt bộ cài đặt Riêng tư để không thể thay đổi các giá trị sau khi đối tượng được tạo.
Base Class:
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;
}
}
}
Kế thừa Class:
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) { }
}
}
tôi đã chạy vào các vấn đề với cả hai. EF yêu cầu một hàm tạo tham số để tạo các đối tượng. EF sẽ không tạo ra các cột cơ sở dữ liệu có trình thiết lập riêng.
Câu hỏi của tôi là nếu có một cách tiếp cận tốt hơn để hoàn thành mục tiêu của tôi với EF:
- Yêu cầu các giá trị cho Created và CreatedBy được dân cư tại instantiation.
- Không thể thay đổi giá trị của Tạo và TạoBởi.
Có một tùy chọn khác: ghi đè 'SaveChanges' trong ngữ cảnh của bạn và thực hiện tất cả các hành động liên quan đến kiểm toán tại đó (thiết lập ngày tạo trên thực thể mới, thiết lập ngày sửa đổi trên thực thể được cập nhật v.v.). Tất cả sẽ được thực hiện ngay trước khi lưu. –
[Tôi đã gặp vấn đề tương tự và thấy điều này hữu ích.] (Http://jmdority.wordpress.com/2011/07/20/using-entity-framework-4-1-dbcontext-change-tracking-for-audit- log /) –
Thay vào đó, tôi sẽ thực hiện một giao diện 'IAuditiable', theo cách đó bạn vẫn có thể có các thực thể không được kiểm tra và những thứ mà bạn có thể thực hiện logic cụ thể cho giao diện đó trong lời gọi SaveChanges() như được đề xuất trong một các câu trả lời dưới đây, nếu đó là những gì bạn muốn. – FRoZeN