Я использую EF с DotNet Core 2.1 в своем приложении.Приложение работает с данными в нескольких взаимосвязанных и связанных между собой таблицах FK.
Мне нужны данные журнала аудита, изменяющие только одну таблицу.Однако моя проблема в том, что в таблице, в которой я нуждаюсь для ведения журнала аудита, достаточно много FK, и для каждого из них я хотел бы зарегистрировать сам FK и поле из связанной таблицы.
Позвольте мне попытаться проиллюстрировать, что яя о - давайте предположим, что это моя модель:
public class Blog {
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
[InverseProperty ("Blog")]
public ICollection<Post> Posts { get; set; }
public Blog() {
Posts = new Collection<Post> ();
}
}
...
[AuditInclude]
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
[Required]
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
Как уже говорилось, я бы хотел, чтобы журнал аудита изменял только одну сущность - скажем, это Post
- вот класс аудита:
public class Audit_Post : IAudit {
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public string Blog { get; set; } // <- I need populating this from Blog.Name
[StringLength (64)]
public string AuditUsername { get; set; }
public DateTime AuditDt { get; set; }
public string AuditAction { get; set; }
public Audit_Manufacturer () { }
}
И вот как я настроил ведение журнала аудита в моем startup.cs -> ConfigureService()
:
...
Audit.Core.Configuration.Setup ()
.UseEntityFramework (ef => ef
.AuditTypeExplicitMapper (m => m
.Map<Post, Audit_Post> ((d, al) => {
al.Blog = d.Blog?.Name; // !! This doesn't work
})
.AuditEntityAction<IAudit> ((evt, entry, auditEntity) => {
Object val;
var gotVal = evt.CustomFields.TryGetValue ("AuditUsername", out val);
string username = null;
if (gotVal && val is string)
username = val as string;
else
username = "<anonymous>";
auditEntity.AuditDt = DateTime.UtcNow;
auditEntity.AuditUsername = username;
auditEntity.AuditAction = entry.Action;
})
)
);
вопрос : можно ли вообще получить и проверитьрегистрировать данные из зависимости зависимой таблицы (один ко многим)?
Помимо упомянутой проблемы, я также столкнулся с не по теме, а именно - если я забуду обновить БД с помощью миграции дляПри инициализации таблицы Audit_Posts
, и я выполняю операции над таблицей Posts
, данные сохраняются в более поздние версии, даже если журналы аудита не могут быть записаны (исключение сохранения UnitOfWork).Есть ли флаг для AuditDbContext
, который заставил бы его работать в той же транзакции, что и исходный запрос?