Ý kiến: Kích hoạt giống như hành vi ẩn, trừ khi bạn tìm kiếm chúng thường không nhận ra chúng ở đó. Tôi cũng muốn giữ cho DB càng “câm” càng tốt khi sử dụng EF, vì tôi đang sử dụng EF nên nhóm của tôi sẽ không cần phải duy trì mã SQL.
Đối với giải pháp của tôi (kết hợp của ASP.NET WebForms và MVC trong C# với Logic kinh doanh trong một dự án mà còn chứa các DataContext):
tôi thời gian gần đây đã có một vấn đề tương tự, và mặc dù cho hoàn cảnh của tôi nó phức tạp hơn (DatabaseFirst, vì vậy yêu cầu tệp TT tùy chỉnh), giải pháp hầu như giống nhau.
Tôi tạo ra một giao diện:
public interface ITrackableEntity
{
DateTime CreatedDateTime { get; set; }
int CreatedUserID { get; set; }
DateTime ModifiedDateTime { get; set; }
int ModifiedUserID { get; set; }
}
Sau đó, tôi chỉ thực hiện mà giao diện trên bất kỳ đơn vị tôi cần phải (vì giải pháp của tôi là DatabaseFirst, tôi cập nhật các tập tin TT để kiểm tra xem bàn có bốn cột, và nếu có thêm giao diện vào đầu ra).
CẬP NHẬT: đây là sự thay đổi của tôi để các tập tin TT, nơi tôi cập nhật các EntityClassOpening()
phương pháp:
public string EntityClassOpening(EntityType entity)
{
var trackableEntityPropNames = new string[] { "CreatedUserID", "CreatedDateTime", "ModifiedUserID", "ModifiedDateTime" };
var propNames = entity.Properties.Select(p => p.Name);
var isTrackable = trackableEntityPropNames.All(s => propNames.Contains(s));
var inherits = new List<string>();
if (!String.IsNullOrEmpty(_typeMapper.GetTypeName(entity.BaseType)))
{
inherits.Add(_typeMapper.GetTypeName(entity.BaseType));
}
if (isTrackable)
{
inherits.Add("ITrackableEntity");
}
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", String.Join(", ", inherits)));
}
Điều duy nhất còn lại là thêm dòng sau vào lớp DataContext một phần của tôi:
public override int SaveChanges()
{
// fix trackable entities
var trackables = ChangeTracker.Entries<ITrackableEntity>();
if (trackables != null)
{
// added
foreach (var item in trackables.Where(t => t.State == EntityState.Added))
{
item.Entity.CreatedDateTime = System.DateTime.Now;
item.Entity.CreatedUserID = _userID;
item.Entity.ModifiedDateTime = System.DateTime.Now;
item.Entity.ModifiedUserID = _userID;
}
// modified
foreach (var item in trackables.Where(t => t.State == EntityState.Modified))
{
item.Entity.ModifiedDateTime = System.DateTime.Now;
item.Entity.ModifiedUserID = _userID;
}
}
return base.SaveChanges();
}
Lưu ý rằng tôi đã lưu ID người dùng hiện tại trong một trường riêng tư trên lớp DataContext mỗi khi tôi tạo nó.
đây là một câu trả lời chi tiết, Cảm ơn bạn Tim. Tôi bị tổn thương theo cách của bạn và nó là tốt để duy trì logic này trong lớp ứng dụng. Bạn có nghĩ nhóm EF có thể bổ sung các ràng buộc mặc định và kích hoạt hỗ trợ vào DataAnnotation hoặc FluentAPI không? – anIBMer
Tôi sẽ chào đón đội EF thêm vào đó, nó sẽ làm mọi việc dễ dàng hơn cho các quy tắc đơn giản. Điều đó nói rằng, có rất thường xuyên ngoại lệ cho các quy tắc, vì vậy biết làm thế nào để kiểm soát hoàn toàn của quá trình này là một kỹ năng có giá trị để tìm hiểu. –
Chính xác bạn đã thực hiện những cập nhật nào đối với tệp TT? – Fergal