gpt4 book ai didi

asp.net-mvc - 无法将 Entity Framework 6.1.3 中打开的事务与 PostgreSQL 一起使用

转载 作者:行者123 更新时间:2023-11-29 13:19:45 40 4
gpt4 key购买 nike

我一直在尝试将 EntityFramework6.Npgsql 与事务一起使用,但是当我调用方法 DbContext.UseTransaction 时出现异常。

错误信息(最新的 InnerException):

"Npgsql.PostgresException (0x80004005): 25P02: current transaction is aborted, commands ignored until end of transaction block"

因此,我创建了一个新项目来模拟并尝试找出导致问题的原因。

测试代码

try
{
using (var conn = new Npgsql.NpgsqlConnection(ConfigurationManager.AppSettings["app:pgconn"]))
{
conn.Open();
using (var transaction = conn.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
{
using (var ctx = new CadastrosContext(conn))
{
var tenant = new Tenant();
ctx.Database.UseTransaction(transaction);
ctx.Tenants.Add(tenant);
await ctx.SaveChangesAsync()
.ConfigureAwait(false);
Debug.WriteLine($"Tenant 1 Id: {tenant.TenantId}");
}
using (var ctx = new CadastrosContext(conn))
{
var tenant = new Tenant();
ctx.Database.UseTransaction(transaction);
ctx.Tenants.Add(tenant);
await ctx.SaveChangesAsync()
.ConfigureAwait(false);
Debug.WriteLine($"Tenant 2 Id: {tenant.TenantId}");
}
await transaction.CommitAsync();
}
}
}
catch (Exception ex)
{
throw;
}

package id="EntityFramework" version="6.1.3" targetFramework="net462"
package id="EntityFramework6.Npgsql" version="3.1.1" targetFramework="net462"
package id="Npgsql" version="3.1.2" targetFramework="net462"

最奇怪的行为是,当我第二次调用该操作时,它起作用了!!经过几个小时调查问题的根源(使用其他数据库代码按预期工作),我发现当我切换到 EF6 的第一个版本时它工作正常。

有效的软件包

package id="EntityFramework" version="6.1.0" targetFramework="net462"
package id="EntityFramework6.Npgsql" version="3.1.1" targetFramework="net462"
package id="Npgsql" version="3.1.2" targetFramework="net462"

谁也遇到过这个问题??Npgsql/EntityFramework6.Npgsql不支持新版EntityFramework有bug吗?

最佳答案

我今天遇到了同样的问题,我唯一能找到的就是你的问题。 :)

对数据库的第一次查询总是失败并出现错误:当前事务被中止,直到事务 block 末尾的命令都被忽略。

在我的例子中,PostgreSQL 日志如下所示:

2019-07-15 14: 43: 40.260 +07 [12364] ERROR: the relation "dbo.EdmMetadata" does not exist (symbol 51)
2019-07-15 14: 43: 40.260 +07 [12364] OPERATOR: SELECT "Extent1". "Id", "Extent1". "ModelHash" FROM "dbo". "EdmMetadata" AS "Extent1" ORDER BY "Extent1" . "Id" DESC LIMIT 1
2019-07-15 14: 43: 40.649 +07 [12364] ERROR: the current transaction is aborted, the commands until the end of the transaction block are ignored
2019-07-15 14: 43: 40.649 +07 [12364] OPERATOR: DELETE FROM "MS". "MessageReference" WHERE E'T '= "Mark"

在执行我的查询之前,EF 尝试从不存在的表 dbo.EdmMetadata 中获取数据,查询失败并且事务未提交。需要此查询来比较用于创建数据库的模型的哈希值与当前模型。但是,如果您对现有数据库使用 Code First,则此表不存在。

要避免此错误,您可以通过将 null 设置为数据库初始化器来禁用模型哈希检查

static YourContext()
{
System.Data.Entity.Database.SetInitializer<BaseDynamicDbContext>(null);
}

在我的例子中,我需要初始化器在应用程序启动时迁移到最新版本,所以我创建了空的 dbo.EdmMetadata 表,以防止第一次查询错误。

create table "dbo"."EdmMetadata"
(
"Id" integer not null
constraint "PK_EdmMetadata"
primary key,
"ModelHash" varchar(50)
);

关于asp.net-mvc - 无法将 Entity Framework 6.1.3 中打开的事务与 PostgreSQL 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099717/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com