Исключение свойств из обновления вместо обновления всего объекта - PullRequest
0 голосов
/ 11 апреля 2019

Я использую ASP.NET Boilerplate с Code-First Entity Framework 6 и MVC 5.

Для обновления сущности я использую UpdateAsync.

Как я могу исключить некоторые свойства из сущности перед выполнением обновления?

Какую функцию использовать, и реализована ли она в ASP.NET Boilerplate или нет?

Я достиг этого в Entity Framework 6 следующим образом:

public virtual TEntity UpdateWithExcludeProperities(TEntity entity,string [] properities)
{
    if (entity == null)
        throw new ArgumentException("Paramter cannot be null", "entity");

    var existedEntity = SelectFromContext(entity.ID);
    if (existedEntity == null)
        throw new ObjectNotFoundException("Record is not found!");

    _context.Entry(existedEntity).CurrentValues.SetValues(entity);
    foreach (var name in properities)
    {
        _context.Entry(existedEntity).Property(name).IsModified = false;
    }
    _context.SaveChanges();
    return existedEntity;
}

public virtual TEntity SelectFromContext(Guid id)
{
    TEntity entity;
    entity = DbSet<TEntity>().SingleOrDefault(e => e.ID == id);
    return entity;
}

Но есть ли возможность реализовать этот код в ASP.NET Boilerplate?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

я смог сделать это в ASP.NET Boilerplate следующим образом, работая непосредственно с основными запросами EQ LINQ

public virtual TEntity SelectFromContext(TPrimaryKey id)
{
    TEntity entity;
    entity = Repository.GetDbContext().Set<TEntity>().SingleOrDefault(e => e.Id.Equals(id));
    return entity;
}

public virtual async Task<TEntity> UpdateWithExclude(TEntity entity, string[] properities)
{
        if (entity == null)
            throw new ArgumentException("Paramter cannot be null", "entity");

        var existedEntity = SelectFromContext(entity.Id);
        if (existedEntity == null)
            throw new ObjectNotFoundException("Record is not found!");

        var currentValues = Repository.GetDbContext().Entry(existedEntity).CurrentValues;

        foreach (var properteyName in currentValues.PropertyNames)//make default false value for all 
        {
            var y = Repository.GetDbContext().Entry(existedEntity).Property(properteyName);
            if (!properities.Contains(y.Name))
                Repository.GetDbContext().Entry(existedEntity).Property(properteyName).IsModified = false;
        }

        Repository.GetDbContext().Entry(existedEntity).CurrentValues.SetValues(entity);

        Repository.GetDbContext().SaveChanges();
        var UpdatedEntity = SelectFromContext(entity.Id);
        return await Task.FromResult(UpdatedEntity);
}
0 голосов
/ 12 апреля 2019

вы на неверном пути!обновить сущность с помощью указанных полей очень просто.

1- Создайте DTO.

2- Настроить сопоставление

3- Получить сущность и сопоставить DTO с сущностью.

Оформить заказ на моем примере.В этом примере объект Student имеет 3 свойства.В методе StudentAppService UpdateOnlyNameOfStudent() мы обновляем только поле Name объекта Student.И обратите внимание, что я даже не запустил _studentRepository.Update(student), потому что AspNet Boilerplate фиксирует изменения, когда метод заканчивается (см. автоматическое изменение сохранения )

StudentDto.cs

[AutoMapFrom(typeof(Student))]
public class StudentDto: EntityDto<long>
{
     public string Name { get; set; }    
}

Student.cs

public class Student: Entity
{
     public string Name { get; set; }  

     public int SchoolNumber { get; set; }  

     public DateTime RegisterDate { get; set; }  
}

StudentAppService.cs

public class StudentAppService : IStudentAppService 
{
    private readonly IRepository<Student> _studentRepository;


    public RoleAppService(IRepository<Student> studentRepository)
    {
       _studentRepository = studentRepository;
    }

    public override async void UpdateOnlyNameOfStudent(StudentDto input)
    {
        var student = _studentRepository.Get(input.Id);
        ObjectMapper.Map(input, student);
    }

    /*
    public override async void UpdateOnlyNameOfStudent_Alternative(StudentDto input)
    {
        var student = _studentRepository.Get(input.Id);
        student.Name = input.Name;            
    }
    */
}

AspNet Boilerplate использует AutoMapper для отображения объектов.См. Отображение объекта на объект

...