在多个上下文中共享EF中的连接和事务(UnintentionalCodeFirstException)

 狄言洁_171 发布于 2023-01-12 16:14

以下版本和问题作为下面的附加上下文提供.改进的问题表述和问题可以如下:

如何在不执行分布式事务的情况下,首先在EF 6.1.0数据库和.NET 4.5.2中的多个上下文之间共享事务?

为此,我看起来需要在多个上下文之间共享一个连接,但到目前为止我一直在寻找的代码示例和教程并没有那么富有成效.问题似乎是如何定义连接对象和事务对象类型的功能组合,以便在构造对象上下文时也构建和找到EF数据库第一个对象元数据.

也就是说,我希望做类似什么在EF 6.n教程描述了这里.一些示例代码可能是

int count1;
int count2;
using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
{ 
    //How to define this connection so as not to run into UnintentionalCodeFirstException?
    //Creating a dummy context to obtain the connectiong string like so
    //dummyContext.Database.Connection.ConnectionString  and then using the connection will be greeted with the aforementioned exception.      
    using(var conn = new SqlConnection("...")) 
    {
        using(var c1 = new SomeEntities(conn, contextOwnsConnection: false))
        {
            //Use some stored procedures etc.
            count1 = await c1.SomeEntity1.CountAsync();
        }

        using(var c2 = new SomeEntities(conn, contextOwnsConnection: false))
        {
            //Use some stored procedures etc.
            count2 = await c2.SomeEntity21.CountAsync();
        }
    }
}   

int count = count1 + count2;

在示例中还有关于如何创建共享连接和事务的其他方法,但是如上所述,罪魁祸首似乎是,例如,如果我在("..."部分)中提供connectiong字符串,之前的片段,因为dummyContext.Database.Connection.ConnectionString我只会得到一个例外.


我不确定我是否只是在阅读错误的来源,或者当我尝试在多个EF上下文中共享事务时,我的代码中还有其他错误.怎么可能呢?

我已经阅读了很多关于这个(例如这个)的SO帖子和一些教程.他们没有帮助.

我有一个奇怪的问题,它看起来我没有像其他教程和帖子中定义的构造函数重载.也就是说,通过链接的教程链接,我无法编写new BloggingContext(conn, contextOwnsConnection: false))和使用共享连接和外部事务.

如果我写的话

public partial class SomeEntities: DbContext
{
    public SomeEntities(DbConnection existingConnection, bool contextOwnsConnection): base(existingConnection, contextOwnsConnection) { }
}

并像在教程中一样使用它,我从以下T4模板生成的代码中得到以下行的异常

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

我正在使用.NET 4.5.2和EF 6.1.0.我是edmx从现有数据库构建的,并从那里生成代码.在这种特殊情况下,我使用任务并行线程来加载许多SQL Server 主数据服务登台表(是的,一个大型模型)并调用相关的程序(由每个表的MDS提供).MDS有自己的补偿逻辑,以防某些表的暂存失败,但回滚事务也应该是可行的.看起来我的EF有一个(奇怪的)问题.

<附录:史蒂夫建议使用直接TransactionScope.没有需要分布式事务的共享连接,这是我可以选择的选项.然后,如果我尝试为上下文提供共享连接(教程中显示的一些选项,我在这里遇到"缺少构造函数"的问题.当我定义一个时,我得到我在代码中引用的异常.总而言之,这感觉很奇怪.也许我的生成DbContext和相关课程有些不对劲.

<注1:看起来根本原因与Arthur(EF开发团队)的博客文章一样.不要错误地使用Code First.也就是说,在数据库第一次开发中,框架寻求连接字符串中定义的类关系映射.在我的连接字符串中有些可疑...

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有