Отслеживание изменений EF Core и Blazor ServerC#

Место общения программистов C#
Ответить
Anonymous
 Отслеживание изменений EF Core и Blazor Server

Сообщение Anonymous »

Я изо всех сил пытаюсь найти хороший шаблон для работы с EF Core и Blazor Server.
По моим исследованиям, лучше всего использовать DI и DbContextFactory . Затем оберните каждую операцию в отдельный DbContext.

Код: Выделить всё

Program.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextFactory();
}

Код: Выделить всё

OrderService.cs:
private readonly IDbContextFactory _contextFactory;

public OrderService(IDbContextFactory contextFactory)
{
_contextFactory = contextFactory;
}

public async Task GetAllOrders()
{
using var ctx = _contextFactory.CreateDbContext();
return await _context.Orders.Include(o=>o.OrderLines).ToArrayAsync();
}
Но проблема в том, что DbContext будет удален, и я потеряю все возможности отслеживания изменений.
Для например, если данные привязаны к редактируемой таблице данных.
Если редактируется много заказов, я не могу просто выполнить context.SaveChanges(), когда пользователь нажимает «Сохранить», и EF Core обновит только те поля, которые были изменены.

Код: Выделить всё

@inject OrderService _orderSerivce;

void DoTest()
{
var orders =_orderSerivce.GetAllOrders(); // Gets 500 orders

Random r = new Random();

// edit upto 20 orders.
for(int i = 0; i < 20; i++)
{
int rInt = r.Next(0, orders.Length-1);
orders[rInt].CustomerName = "NameChanged " + i;
}

_orderSerivce.UpdateOrders(orders); // ?? What should this do
}
Я не уверен, как должна работать функция UpdateOrders?
Должен ли я просто прикрепить заказы и позволить ей обновить все 500 заказы. SaveChanges отслеживал бы, что было отредактировано и что нового, и обрабатывал бы все это за меня. Например

Код: Выделить всё

public async Task UpdateOrders(Order[] orders)
{
// Use a new context instance to perform the updates
using var ctx = _contextFactory.CreateDbContext();

foreach (var order in orders)
{
// Attach each order to the context and mark it as modified
ctx.Orders.Attach(order);
ctx.Entry(order).State = EntityState.Modified;
}

// Save all changes to the database
await ctx.SaveChangesAsync();
}
Но с удаленным контекстом, как мне теперь извлечь только изменения для обновления?

Подробнее здесь: https://stackoverflow.com/questions/791 ... zor-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»