Entity Framework. Плюс с Entity Framework в моем приложении для отслеживания аудита. У меня есть один родительский класс Client
и дочерний класс Address
в одной и той же сущности.
Но когда я изменяю значение объекта адреса в Client
, и я попытаюсь сохранить его, это не так Работа. Если я не использую приведенный ниже формат, мне будет сложно отследить обновление сущности, поскольку Z.EntityFramework.Plus требует вручную обновлять запись для входа в систему аудита для каждой обновленной сущности.
Только обновить Client
объект если я использовал подход, описанный ниже, и отслеживал только те модификации клиента, которые я сделал.
using (var scope = _ServiceScopeFactory.CreateScope())
{
var referenceContext = scope.ServiceProvider.GetService<ApplicationDbContext>();
// Use for Audit Logging
var audit = new Audit();
audit.CreatedBy = client.LastModifiedBy;
var originalClient = client;
client.LastModifiedAt = DateTime.UtcNow;
referenceContext.Entry(originalClient.Address).CurrentValues.SetValues(client.Address);
referenceContext.Entry(originalClient).CurrentValues.SetValues(client);
// Pass Audit Insatnce for Audit Logging
referenceContext.SaveChanges(audit);
}
Это работает, если я придерживаюсь подхода, описанного ниже, но с помощью этого я не могу отслеживать аудит какой-либо сущности.
using (var scope = _ServiceScopeFactory.CreateScope())
{
var referenceContext = scope.ServiceProvider.GetService<ApplicationDbContext>();
referenceContext.Entry(client.Address).State = EntityState.Modified;
referenceContext.Entry(client).State = EntityState.Modified;
referenceContext.SaveChanges();
}
public class Client : AuditInfo
{
[Required]
public int Id { get; set; }
[Required, MaxLength(35, ErrorMessage = "Sorry you are exceeding the character limit for First Name.")]
[RegularExpression("^([a-zA-Z]+[,.]?[ ]?|[a-zA-Z]+['-]?)+$", ErrorMessage = "First Name must contain character only.")]
public string FirstName { get; set; }
[MaxLength(35, ErrorMessage = "Sorry you are exceeding the character limit for Middle Name.")]
[RegularExpression("^([a-zA-Z]+[,.]?[ ]?|[a-zA-Z]+['-]?)+$", ErrorMessage = "Middle Name must contain character only.")]
public string MiddleName { get; set; }
[Required, MaxLength(35, ErrorMessage = "Sorry you are exceeding the character limit for Last Name.")]
[RegularExpression("^([a-zA-Z]+[,.]?[ ]?|[a-zA-Z]+['-]?)+$", ErrorMessage = "Last Name must contain character only.")]
public string LastName { get; set; }
[Required, MaxLength(35)]
public string Gender { get; set; }
[Required]
[DataType(DataType.Date), Column(TypeName = "date")]
public DateTime DateOfBirth { get; set; }
[ValidateComplexType]
public Address Address { get; set; }
}
public class Address : AuditInfo
{
[Required]
public int Id { get; set; }
[Required, MaxLength(1024, ErrorMessage = "Sorry you are exceeding the character limit for First Line.")]
public string FirstLine { get; set; }
public string SecondLine { get; set; }
[Required(ErrorMessage = "Please select the Province"), MaxLength(256, ErrorMessage = "Sorry you are exceeding the character limit for Province.")]
public string Province { get; set; }
[Required, MaxLength(256, ErrorMessage = "Sorry you are exceeding the character limit for City.")]
[RegularExpression("^([a-zA-Z]+[,.]?[ ]?|[a-zA-Z]+['-]?)+$", ErrorMessage = "City Name contain character only.")]
public string City { get; set; }
[Required, MaxLength(256, ErrorMessage = "Sorry you are exceeding the character limit for PostalCode.")]
public string PostalCode { get; set; }
[Required]
public bool IsActive { get; set; }
}