这是标准的交易方式。
您可以将多个查询组合在一起。
using (var context = new SchoolContext())
{
var std = new Student()
{
FirstName = "Bill",
LastName = "Gates"
};
context.Students.Add(std);
context.SaveChanges();
std = context.Students.First<Student>();
std.FirstName = "Steve";
context.SaveChanges();
}
EF Core 可以使用相同的连接、不同的连接或基于连接池。EF Core 具有连接和断开模式的事务处理。我认为这适合您。
在断开的情况下保存数据与连接的情况下略有不同。在断开的情况下,DbContext 不知道断开的实体,因为实体是在当前 DbContext 实例的范围之外添加或修改的。所以,您需要将断开的实体附加到具有适当 EntityState 的上下文中,以便执行数据库的增删改操作。
以下图示说明了断开情况下的 CUD(Create、Update、Delete)操作:
根据上图,未被 DbContext 跟踪的断开实体(即实体)需要用适当的 EntityState 附加到 DbContext 上。例如,对于新实体,使用添加状态;对于已编辑的实体,使用修改状态;对于已删除的实体,使用已删除状态。当调用 SaveChanges() 方法时,将在数据库中生成 INSERT、UPDATE 或 DELETE 命令。
以下步骤必须按顺序执行,才能在 EF Core 中使用断开场景插入、更新或删除记录:
使用适当的 EntityState(例如 Added、Modified 或 Deleted)将实体附加到 DbContext
调用 SaveChanges() 方法
以下示例演示使用上述步骤向数据库插入新记录:
var std = new Student(){ Name = "Bill" };
using (var context = new SchoolContext())
{
context.Add<Student>(std);
context.SaveChanges();
}
在上面的例子中,std是一个已断开连接的Student实体实例。context.Add() 方法将一个Student实体附加到具有Added状态的上下文中。SaveChanges()方法构建并执行以下INSERT语句:
exec sp_executesql 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())
{
context.Database.Connection.Open();
var blog = new Blog { };
context.Blogs.Add(blog);
context.SaveChanges();
blog = new Blog { };
context.Blogs.Add(blog);
context.SaveChanges();
}
}
}
}
https://learn.microsoft.com/en-us/ef/ef6/fundamentals/connection-management?redirectedfrom=MSDN