Audit.net, кажется, зависает, когда в качестве целевого объекта используется динамический прокси-объект - PullRequest
2 голосов
/ 18 октября 2019

Я пытался заставить Audit.Net работать для моего проекта MVC EF 6.2. У меня все настроено и я могу сохранить свои журналы аудита в моей таблице sql server. У меня проблема с объектами, которые напрямую возвращаются из моего контекста БД. EF создает динамический тип прокси для таких объектов, и по какой-то причине при использовании в качестве целевого объекта в моей области аудита он просто зависает в операторе using безкогда-либо входя в блок использования и никакие исключения / ошибки не обнаруживаются. Просто там висит и ничего не происходит.

Все работает для объектов, которые возвращаются из моих сервисов webapi / wcf как DTO.

Моя настройка в Global.asax

 Audit.Core.Configuration.Setup()
    .UseSqlServer(config => config

    .ConnectionString(ConfigurationManager.ConnectionStrings["DBContext"].ConnectionString)
                .Schema("dbo")
                .TableName("SystemEvents")
                .IdColumnName("EventId")
                .JsonColumnName("Data")
                .LastUpdatedColumnName("LastUpdatedDate"));

Код для области аудита:

var record = _context.FileRecord.Include(a => a.Contact).SingleOrDefault(c => c.Id == id);
using(var audit = AuditScope.Create(new AuditScopeOptions 
{ DataProvider = new SqlDataProvider { // settings here }, 
  EventType = "Update", 
  TargetGetter = () => FileRecord 
}) <--- hangs right here and never executes the code inside the brackets
{
     record.ContactId = 33
     // more properties to be updated
}

_context.SaveChanges();

Моя модель таблицы:

public class FileRecord
{
    public int Id { get; set; }
    // more members

    // Have references to other tables here
    public virtual ICollection<StageHistory> StageHistories { get; set; }
    public virtual Contact Contact { get; set; }
}

Это похоже на проблему с EF, создающим типы прокси, потому что я могу заставить это работать, еслиЯ просто устанавливаю для целевого объекта значение null или создаю совершенно новый экземпляр объекта, например () => new FileRecord (), чтобы получить реальный объект-сущность, а не прокси-версию, но при этом я не смогу сохранитьотслеживание старых и новых изменений на объекте.

Любая помощь будет оценена, спасибо.

...