Scaffold-DbContext - как запретить добавление нескольких одинаковых столбцов, таких как ID, CreatedDate, CreatedBy и т. Д. - PullRequest
1 голос
/ 30 января 2020

Все таблицы имеют несколько одинаковых столбцов (ID, CreatedDate, CreatedBy). Я хочу использовать эти столбцы в новом BaseEntity.cs, а затем связать его со всеми сущностями. Мне не нужно удалять эти столбцы и связывать BaseEntity.cs один за другим классом сущностей после ввода команды scaffold-dbcontext. Возможно ли это сделать?

Я не хочу получать сгенерированную автоматическую сущность после использования scaffold-dbcontext следующим образом.

public partial class User 
{
       public int Id { get; set; }
       public string Name { get; set; }
       public DateTime? CreatedDate { get; set; }
       public string CreatedBy { get; set; }
}

Мне нужно получить вот так. Scaffold-DbContext без добавления ID, CreatedDate, CreatedBy.

public partial class User 
{
       public string Name { get; set; }
}

Затем я могу использовать ID, CreatedDate и CreatedBy в BaseEntity.cs и связать его со всеми классами сущностей. Мне не нужно удалять 3 столбца вручную из каждого класса сущностей после каждой команды scaffold-dbcontext.

public class BaseEntity 
{
       public int Id { get; set; }
       public DateTime? CreatedDate { get; set; }
       public string CreatedBy { get; set; }
}

.

public partial class User : BaseEntity
{
       public string Name { get; set; }
}

1 Ответ

0 голосов
/ 30 января 2020

Вы можете использовать базовый класс Dto со свойствами CreatedBy, CreatedDate ..., а затем переопределить метод SaveChanges() в вашем DbContext, чтобы вносить эти изменения при обновлении и при создании для каждой сущности. Как это:

    public override int SaveChanges()
            {
                if (_contextAuditor != null)
                {
                    Update(ChangeTracker.Entries());
                    Create(ChangeTracker.Entries());
                }

                return base.SaveChanges();
            }

public void Update(IEnumerable<EntityEntry> changedEntities)
        {
            IEnumerable<EntityEntry> editedEntities = changedEntities
                .Where(e => e.State == EntityState.Modified)
                .ToList();

            foreach (EntityEntry entity in editedEntities)
            {
                if (entity.Entity is IUpdateableDtoModel updateableEntity)
                {
                    updateableEntity.UpdatedDate = DateTime.Now;
                    updateableEntity.UpdatedBy = GetCurrentUserName();
                }
            }
        }

 public void Create(IEnumerable<EntityEntry> changedEntities)
        {
            IEnumerable<EntityEntry> createdEntities = changedEntities
                .Where(e => e.State == EntityState.Added)
                .ToList();

            foreach (EntityEntry entity in createdEntities)
            {
                if (entity.Entity is ICreateableDtoModel updateableEntity)
                {
                    updateableEntity.CreatedDate = DateTime.Now;
                    updateableEntity.CreatedBy = updateableEntity.CreatedBy ?? GetCurrentUserName();
                }
            }
        }
...