По моим исследованиям, лучше всего использовать 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();
}
Для например, если данные привязаны к редактируемой таблице данных.
Если редактируется много заказов, я не могу просто выполнить 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
}
Должен ли я просто прикрепить заказы и позволить ей обновить все 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
Мобильная версия