Entity Framework как добавить свойства во время сохранения, требуемые всеми объектами

#entity-framework

#entity-framework

Вопрос:

Я использую entity Framework, и у меня есть некоторые свойства, которые являются общими для всех объектов:

Созданное пользователем имя CreatedDateTime LastModifiedByUserName LastModifiedDatetime

Итак, в настоящее время я сохраняю новое свойство, и мне приходится действовать следующим образом:

 _db.ProjectApprovals.Add(projectApproval);
                    projectApproval.CreatedByUserName = "Dev";
                    projectApproval.CreatedDateTime = DateTime.Now;
                    _db.SaveChanges();
  

Как вы можете себе представить, что нужно делать:

 projectApproval.CreatedByUserName = "Dev";
                        projectApproval.CreatedDateTime = DateTime.Now;
  

для всех объектов каждое сохранение — это боль. Я думал о том, чтобы обернуть сохранение, а затем я мог бы сделать это там. Проблема в том, как я узнаю, какие объекты в контексте были добавлены или изменены.

Ответ №1:

Прежде всего, вы должны определить общий интерфейс для всех ваших объектов, реализующих эти свойства:

 public interface IEntity
{
    string CreatedByUserName { get; set; }
    DateTime CreatedDateTime { get; set; }
    ...
}
  

Реализуйте этот интерфейс в своих сущностях и переопределите SaveChanges метод в вашем производном ObjectContext .

 public override int SaveChanges(SaveOptions saveOptions)
{
    var entries = this.ObjectStateManager
                      .GetObjectStateEntries(EntityState.Added | EntityState.Modified)
                      .Where(x => !x.IsRelationship amp;amp; x.Entity is IEntity);

    foreach (var entry in entiries)
    {
       var entity = entry.Entity as IEntity;

       if (entry.State == EntityState.Added)
       {
          ...
       } 
       else
       { 
          ...
       }
    }


    return SaveChagnes(saveOptions);
}
  

Комментарии:

1. Это кажется хорошим подходом, но я не использую ObjectContext, я использую DbContext, который, похоже, не имеет свойства ObjectStateManager.

2. Есть DbChangeTracker вместо или вы можете преобразовать DbContext в ObjectContext через IObjectContextAdapter .