Обновление EF Core со списком - PullRequest
0 голосов
/ 07 мая 2020

Чтобы обновить запись сервера SQL с помощью Entity Framework Core, я запрашиваю запись, которую мне нужно обновить, вношу изменения в объект и затем вызываю .SaveChanges(). Это работает красиво и чисто.

Например:

var emp = _context.Employee.FirstOrDefault(item => item.IdEmployee == Data.IdEmployee);
emp.IdPosition = Data.IdPosition;
await _context.SaveChangesAsync();

Но есть ли стандартный метод, если я хочу обновить несколько записей?

Мой первый подход заключался в использовании списка, передающего его контроллеру , но тогда мне нужно было бы go просматривать этот список и каждый раз сохранять изменения, я никогда не заканчивал этот вариант, так как считал его не оптимальным.

Сейчас я делаю вместо того, чтобы передавать список в контроллер, я передаю каждый объект контроллеру с помощью for. (вроде то же самое ...)

for(int i = 0; i < ObjectList.Count; i ++) 
{
    /* Some code */
    var httpResponseObject = await MyRepositories.Post<Object>(url+"/Controller", Object);
}

А затем сделайте то же самое на контроллере, что и раньше, при обновлении только одной записи для каждой из записей ...

Я не считаю, что это лучший из возможных подходов, но я пока не нашел другого пути.

Каким будет оптимальный способ сделать это?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Ваш вопрос не имеет ничего общего с Blazor ... Однако я не уверен, что понимаю, в чем проблема. Когда вы вызываете метод SaveChangesAsyn c, все изменения в вашем контексте фиксируются в базе данных. Вам не нужно передавать по одному объекту за раз ... Вы можете передать список объектов

Надеюсь, это поможет ...

0 голосов
/ 07 мая 2020

Массовое обновление записей с использованием Entity Framework или других библиотек объектно-реляционного сопоставления (ORM) является распространенной проблемой, поскольку они запускают команду UPDATE для каждой записи. Вы можете попробовать использовать Entity Framework Plus , которое является расширением для массовых обновлений.

Если для вас критично обновление нескольких записей с помощью одного вызова, я бы рекомендовал просто написать хранимую процедуру и звоните, если из вашей службы. Entity Framework также может выполнять прямые запросы и хранимые процедуры.

Похоже, что пользователь вносит некоторые изменения, а затем необходимо действие сохранения для одновременного сохранения нескольких записей. Вы можете инициировать несколько вызовов AJAX или, если вам нужно, только один.

Я бы создал конечную точку - с контроллером API и действием - которое определяет c в соответствии с вашими потребностями. Например, чтобы обновить положение записей в таблице:

Контроллер:

/DataOrder

Действие:

[HttpPut]
public async void Update([FromBody] DataChanges changes)
{
    foreach(var change in changes)
    {
        var dbRecord = _context.Employees.Find(change.RecordId);
        dbRecord.IdPosition  = change.Position;
    }
    _context.SaveChanges();
}  

public class DataChanges
{
    public List<DataChange> Items {get;set;}

    public DataChangesWrapper()
    {
        Items = new List<DataChange>();
    }
}

public class DataChange
{
    public int RecordId {get;set;}
    public int Position {get;set;}
}

Оператор foreach выполнит UPDATE для каждой записи. Однако, если вам нужен один вызов базы данных, вы можете написать запрос SQL или иметь хранимую процедуру в базе данных и вместо этого передать данные как параметр DataTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...