Переопределение LLBLGen Save() с пользовательскими столбцами

В нашей программе около 50+ сущностей в LLBLGEN. Все они имеют 2 столбца с именами ModifyDatetime и ModifyUserID. Они также являются двумя последними столбцами в каждой таблице базы данных SQL.

Мы хотим изменить функцию LLBLGEN в .Save(), чтобы переменная сеанса и текущее время отправлялись на ВСЕ объекты, когда программисты выполняют .Save().

Я получил его, чтобы сохранить идентификатор пользователя сеанса и дату и время, но в некоторых случаях я получаю сообщение об ошибке, и я думаю, что это связано с изменением положения столбца во время рендеринга или компиляции.

Я скопировал две общедоступные виртуальные функции из одного из ___Entity.cs (в данном случае это CityEntity.cs), и это сработало даже при сохранении другого типа сущности (ServicesEntity.cs). Итак, какое-то время я думал, что CityFieldIndex.* — это просто случайное целое число. Оба класса имеют разное количество столбцов. Или, может быть, я не совсем понимаю этот общедоступный виртуальный и как его переопределить.

Я также пробовал просто отправлять Rows.Count - 1 и Rows.Count - 2 вместо CityFieldIndex.*

Также возникает странная ошибка при наборе ModifyUserId: значение 33 имеет тип «System.Int32», а поле имеет тип «System.Nullable`1 [System.DateTime]» (33 — это идентификатор пользователя)

Пользовательский код на CommonEntityBase.cs:

public override bool Save(IPredicate updateRestriction, bool recurse)
{
      System.Diagnostics.Debug.WriteLine("i'm overriding SAVE yeii");
      ModifyDatetime = DateTime.Now;
      ModifyUserId = 33;

      return base.Save(updateRestriction, recurse);
}

public virtual Nullable<System.DateTime> ModifyDatetime
{
    get { return (Nullable<System.DateTime>)GetValue((int)CityFieldIndex.ModifyDatetime, false); }
    set { SetValue((int)CityFieldIndex.ModifyDatetime, value, true); }
}    

public virtual Nullable<System.Int32> ModifyUserId
{
    get { return (Nullable<System.Int32>)GetValue((int)CityFieldIndex.ModifyUserId, false); }
    set { SetValue((int)CityFieldIndex.ModifyUserId, value, true); }
}

person elcool    schedule 30.11.2012    source источник
comment
нет времени сформулировать полный ответ, поэтому публикую в комментариях. Вы можете изучить Возможность аудита встроена в сам LLBLGen.   -  person explunit    schedule 01.12.2012
comment
также вы можете пересмотреть ссылку на HttpContext непосредственно из Сохранить. Это тесно связывает его с веб-приложением и вызовет проблемы, если у вас есть консольная утилита (например), которой необходимо сохранять данные. Возможно, было бы лучше, если бы все объекты, поддерживающие эти свойства, реализовывали один и тот же интерфейс. Затем вы можете использовать геттеры/сеттеры для объекта и не иметь дело с тем фактом, что индексы полей отключены.   -  person explunit    schedule 01.12.2012
comment
Да, я столкнулся с проблемой утилиты консоли. Сейчас я сначала проверяю, является ли HttpContext нулевым. Смотрите ответ.   -  person elcool    schedule 09.12.2012


Ответы (1)


Я решил эту проблему.
Теперь он сохраняет пользователя из сеанса каждый раз, когда кто-то другой использует Save(). Если пользовательского набора нет, он просто помещает UserId = 0.

Конечно, мы закрыли наше приложение для проверки сеансов входа в систему, и только системные службы сохраняются с использованием 0 :)

 public override bool Save(IPredicate updateRestriction, bool recurse)
    {
        ModifyDatetime = DateTime.Now;
        int userID = 0;

        // Verifies the UserId that called the Save(). Uses 0 (as system user) when none is found.
        try
        {
            if (HttpContext.Current.Session["UserID"] != null)
            { userID = Convert.ToInt32(HttpContext.Current.Session["UserID"]); }

        }
        catch (NullReferenceException nullE)
        {
            userID = 0;
        }
        ModifyUserObjectId = userID;

        return base.Save(updateRestriction, recurse);
    }

    /// <summary> The ModifyDatetime property of all Entities<br/><br/></summary>
    /// <remarks>All tables must have the field: *table*."modifyDatetime"<br/>
    public virtual Nullable<System.DateTime> ModifyDatetime
    {
    //    get { return (Nullable<System.DateTime>)GetValue((int)base.Fields["ModifyDatetime"].FieldIndex, false); }  // uncomment for GET
        set { SetValue((int)base.Fields["ModifyDatetime"].FieldIndex, value, true); }
    }

    /// <summary> The ModifyUserObjectId property of all Entities<br/><br/></summary>
    /// <remarks>All tables must have the field: *table*."modifyUser_objectID"<br/>
    public virtual Nullable<System.Int32> ModifyUserObjectId
    {
    //    get { return (Nullable<System.Int32>)GetValue((int)base.Fields["ModifyUserObjectId"].FieldIndex, false); }  // uncomment for GET
        set { SetValue((int)base.Fields["ModifyUserObjectId"].FieldIndex, value, true); }
    }

Все еще не знаю, будет ли это работать для коллекций. Но это должен быть один и тот же код.

person elcool    schedule 08.12.2012