Обновите значение дочернего объекта в ядре EF с помощью Entity Framework.Plus для отслеживания аудита. - PullRequest
0 голосов
/ 07 января 2020

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; }
}
...