EntityState.Modify вместо Delete в моей базе данных

Я использую AuditTrail для ведения журнала, но у меня проблема. Я пробовал этот метод;

http://kamoga.net/audit-trail-and-entity-change-tracking-using-entity-framework-dbcontext/

Но я не удаляю запись для операций удаления. У меня есть столбец IsDeleted, и я установил для него значение true.

Если я использую EntityState.Modified в своем ActionResult, в моем столбце Action будет установлено значение U, но я хочу установить D в базе данных.

 [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {

            dbContext = new dbContext();

            Gallery gallery = dbContext.Gallery.Find(id);                
            gallery.IsDeleted = true;  
            dbContext.Entry(gallery).State = System.Data.Entity.EntityState.Modified;
       dbContext.SaveChanges();
}

Мой Enum;

public enum AuditActions
{
    I,
    U,
    A
}

AuditTrail.cs;

public class AuditTrail
{
    public int Id { get; set; }
    public string TableName { get; set; }
    public string UserName { get; set; }
    public string Actions { get; set; }
    public string OldData { get; set; }
    public string NewData { get; set; }
    public string ChangedColums { get; set; }
    public string TableIdValue { get; set; }

}

AuditFactoryTrail.cs;

public AuditTrail GetAudit(DbEntityEntry entry)
    {
        AuditTrail audit = new AuditTrail();
        audit.UserName = "Current User";     //You can pass the current user as a parameter
        audit.TableName = GetTableName(entry);
        audit.TableIdValue = GetKeyValue(entry);

        //entry is Added 
        if (entry.State == EntityState.Added)
        {
            var newValues = new StringBuilder();
            SetAddedProperties(entry, newValues);
            audit.NewData = newValues.ToString();
            audit.Actions = AuditActions.I.ToString();
        }
        //entry in deleted
        else if (entry.State == EntityState.Deleted)
        {
            var oldValues = new StringBuilder();
            SetDeletedProperties(entry, oldValues);
            audit.OldData = oldValues.ToString();
            audit.Actions = AuditActions.D.ToString();
        }
        //entry is modified
        else if (entry.State == EntityState.Modified)
        {
            var oldValues = new StringBuilder();
            var newValues = new StringBuilder();
            SetModifiedProperties(entry, oldValues, newValues);
            audit.OldData = oldValues.ToString();
            audit.NewData = newValues.ToString();
            audit.Actions = AuditActions.U.ToString();

            var modifiedProperties = entry.CurrentValues.PropertyNames.Where(propertyName => entry.Property(propertyName).IsModified).ToList();
            var properties = string.Join("||", modifiedProperties.ToList());
            audit.ChangedColums = properties;

        }

        return audit;
    }

    private void SetAddedProperties(DbEntityEntry entry, StringBuilder newData)
    {
        foreach (var propertyName in entry.CurrentValues.PropertyNames)
        {
            var newVal = entry.CurrentValues[propertyName];
            if (newVal != null)
            {
                newData.AppendFormat("{0} = {1} || ", propertyName, newVal);
            }
        }
        if (newData.Length > 0)
            newData = newData.Remove(newData.Length - 3, 3);
    }

    private void SetDeletedProperties(DbEntityEntry entry, StringBuilder oldData)
    {
        DbPropertyValues dbValues = entry.GetDatabaseValues();
        foreach (var propertyName in dbValues.PropertyNames)
        {
            var oldVal = dbValues[propertyName];
            if (oldVal != null)
            {
                oldData.AppendFormat("{0} = {1} || ", propertyName, oldVal);
            }
        }
        if (oldData.Length > 0)
            oldData = oldData.Remove(oldData.Length - 3, 3);
    }

    private void SetModifiedProperties(DbEntityEntry entry, StringBuilder oldData, StringBuilder newData)
    {
        DbPropertyValues dbValues = entry.GetDatabaseValues();
        foreach (var propertyName in entry.OriginalValues.PropertyNames)
        {
            var oldVal = dbValues[propertyName];
            var newVal = entry.CurrentValues[propertyName];
            if (oldVal != null && newVal != null && !Equals(oldVal, newVal))
            {
                newData.AppendFormat("{0} = {1} || ", propertyName, newVal);
                oldData.AppendFormat("{0} = {1} || ", propertyName, oldVal);
            }
        }
        if (oldData.Length > 0)
            oldData = oldData.Remove(oldData.Length - 3, 3);
        if (newData.Length > 0)
            newData = newData.Remove(newData.Length - 3, 3);

    }

    private string GetKeyValue(DbEntityEntry entry)
    {
        var objectStateEntry = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity);
        string id = "0";
        if (objectStateEntry.EntityKey.EntityKeyValues != null)
            id = objectStateEntry.EntityKey.EntityKeyValues[0].Value.ToString();

        return id;
    }

    private string GetTableName(DbEntityEntry dbEntry)
    {
        TableAttribute tableAttr = dbEntry.Entity.GetType().GetCustomAttributes(typeof(TableAttribute), false).SingleOrDefault() as TableAttribute;
        string tableName = tableAttr != null ? tableAttr.Name : dbEntry.Entity.GetType().Name;
        return tableName;
    }

    private EntityObject CloneEntity(EntityObject obj)
    {
        DataContractSerializer dcSer = new DataContractSerializer(obj.GetType());
        MemoryStream memoryStream = new MemoryStream();

        dcSer.WriteObject(memoryStream, obj);
        memoryStream.Position = 0;

        EntityObject newObject = (EntityObject)dcSer.ReadObject(memoryStream);
        return newObject;
    }
}

DbContext.cs;

 public override int SaveChanges()
    {
        var auditFactory = new AuditTrailFactory(this);



        var entityList = ChangeTracker.Entries().Where(p =>
        p.State == EntityState.Added ||                
        p.State == EntityState.Deleted ||               
        p.State == EntityState.Modified ||              
        !(p.Entity is AuditTrail) ||                    
        p.Entity != null);                           

        entityList.ToList().ForEach(entity =>
        {
            AuditTrail audit = auditFactory.GetAudit(entity);
            AuditTrail.Add(audit);                          
        });

        return base.SaveChanges();
    }

Вы устанавливаете audit.Actions = AuditActions.U.ToString(); в свой блок else if (entry.State == EntityState.Modified). Вам нужно будет добавить дополнительную проверку, чтобы определить, является ли свойство IsDeletedtrue, и если да, установите audit.Actions = AuditActions.D.ToString();

user3559349 02.05.2018 15:05

@StephenMuecke Здравствуйте, Стивен! Как добавить дополнительную проверку в AuditTrail.cs? Могу ли я отправить значение из контроллера? Вы имеете в виду это? public AuditTrail GetAudit (запись DbEntityEntry, IsDeleted) {}

user9582479 02.05.2018 15:11

Основываясь на коде в других ваших методах, возможно, что-то вроде var newVal = entry.CurrentValues["IsDeleted"];, и проверьте, есть ли его true

user3559349 02.05.2018 15:20

@StephenMuecke; Большое спасибо. Я исправляю свой код; var isDeleted = entry.CurrentValues ​​["IsDeleted"]; .... если ((bool) (IsDeleted) == true) {audit.Actions = AuditActions.D.ToString (); } еще {audit.Actions = AuditActions.U.ToString (); }

user9582479 02.05.2018 15:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
204
0

Другие вопросы по теме