Это стандартный способ совершения транзакции. Вы можете комбинировать несколько запросов.
using (var context = new SchoolContext())
{
var std = new Student()
{
FirstName = "Bill",
LastName = "Gates"
};
context.Students.Add(std);
// or
// context.Add<Student>(std);
context.SaveChanges();
std = context.Students.First<Student>();
std.FirstName = "Steve";
context.SaveChanges();
}
ef Ядро может использовать одно и то же соединение или другое или основанное на пуле соединений. Ef ядро подключил и отключил режим транзакции. Я думаю, что это может подойти вам. Сохранение данных в отключенном сценарии немного отличается от связанного сценария. В отключенном сценарии DbContext не знает об отключенных объектах, поскольку объекты были добавлены или изменены вне области действия текущего экземпляра DbContext. Таким образом, вам необходимо присоединить отключенные сущности к контексту с соответствующим EntityState для выполнения операций CUD (создание, обновление, удаление) с базой данных.
На следующем рисунке показаны операции CUD в отключенном сценарии:
Согласно приведенному выше рисунку, к DbContext необходимо присоединить несвязанные сущности (сущности, которые не отслеживаются DbContext) с соответствующим EntityState. Например, добавленное состояние для новых сущностей, измененное состояние для отредактированных сущностей и удаленное состояние для удаленных сущностей, что приведет к команде INSERT, UPDATE или DELETE в базе данных при вызове метода SaveChanges ().
Для вставки, обновления или удаления записей в таблице БД с использованием Entity Framework Core в отключенном сценарии необходимо выполнить следующие шаги:
Присоединить объект к DbContext с соответствующим EntityState, например, Добавлено, Изменено, или Deleted Call SaveChanges () метод В следующем примере демонстрируется вставка новой записи в базу данных с помощью описанных выше шагов:
//Disconnected entity
var std = new Student(){ Name = "Bill" };
using (var context = new SchoolContext())
{
//1. Attach an entity to context with Added EntityState
context.Add<Student>(std);
//or the followings are also valid
// context.Students.Add(std);
// context.Entry<Student>(std).State = EntityState.Added;
// context.Attach<Student>(std);
//2. Calling SaveChanges to insert a new record into Students table
context.SaveChanges();
}
В приведенном выше примере std является отключенным экземпляром сущности Student. Метод context.Add () присоединяет сущность Student к контексту с состоянием Added. Метод SaveChanges () создает и выполняет следующую инструкцию INSERT:
exe c sp_execute sql N'SET NOCOUNT ON; https://www.entityframeworktutorial.net/efcore/saving-data-in-disconnected-scenario-in-ef-core.aspx Это важные методы.
public DbContext(DbConnection existingConnection, bool contextOwnsConnection)
public DbContext(DbConnection existingConnection, DbCompiledModel model, bool contextOwnsConnection)
Поведение в EF6 и будущих версиях Для EF6 и будущих версий мы приняли подход, который, если вызывающий код решит открыть соединение с помощью вызывая context.Database.Connection.Open (), тогда у него есть веская причина для этого, и фреймворк будет считать, что ему нужен контроль над открытием и закрытием соединения, и больше не будет закрывать соединение автоматически.
Примечание
Это может привести к тому, что соединения будут открыты в течение длительного времени, поэтому используйте их с осторожностью.
Мы также обновили код, чтобы ObjectContext.Connection.State теперь отслеживал состояние базовое соединение правильно.
using System;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Infrastructure;
namespace ConnectionManagementExamples
{
internal class DatabaseOpenConnectionBehaviorEF6
{
public static void DatabaseOpenConnectionBehavior()
{
using (var context = new BloggingContext())
{
// At this point the underlying store connection is closed
context.Database.Connection.Open();
// Now the underlying store connection is open and the
// ObjectContext.Connection.State correctly reports open too
var blog = new Blog { /* Blog’s properties */ };
context.Blogs.Add(blog);
context.SaveChanges();
// The underlying store connection remains open for the next operation
blog = new Blog { /* Blog’s properties */ };
context.Blogs.Add(blog);
context.SaveChanges();
// The underlying store connection is still open
} // The context is disposed – so now the underlying store connection is closed
}
}
}
https://docs.microsoft.com/en-us/ef/ef6/fundamentals/connection-management?redirectedfrom=MSDN