Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何同时处理实体框架和ADO.NET_C# - Fatal编程技术网

C#如何同时处理实体框架和ADO.NET

C#如何同时处理实体框架和ADO.NET,c#,C#,我有一个父-子数据窗口窗体。我的父数据由使用entity Framework创建的实体类获取 但我的子datagridview数据源与一个datatable绑定,该datatable具有来自我的数据库的多数据表查询 因此,我使用实体框架插入或更新“父”数据,并使用ADO.NET创建和更新“子”数据记录 当我插入子数据时,我必须将父数据的Id作为外键 在此设置中,如何在这两者之间进行事务处理? 只需使用TransactionScope?使用相同的DB连接并在该对象上启用事务,或者创建多个连接并附加

我有一个父-子数据窗口窗体。我的父数据由使用entity Framework创建的实体类获取

但我的子datagridview数据源与一个datatable绑定,该datatable具有来自我的数据库的多数据表查询

因此,我使用实体框架插入或更新“父”数据,并使用ADO.NET创建和更新“子”数据记录

当我插入子数据时,我必须将父数据的Id作为外键

在此设置中,如何在这两者之间进行事务处理?
只需使用
TransactionScope

使用相同的DB连接并在该对象上启用事务,或者创建多个连接并附加相同的事务对象。在一般情况下,事务是不好的设计思想。在这里,让一切都成为同一个操作的一部分,be和idea DB隐式事务,在这种情况下,一切都去了,或者什么都没有。在这种情况下,这可能行得通,但在具有多个资源(如集合)的一般分布式事务中,总是不好的主意,总是尝试使用隐式事务
//Simpy use TransactionScope can solve this problem. 
        using (TransactionScope scope = new TransactionScope())
        {
            tblOrder tblOrder = new tblOrder() { FOrderNum = "12345", FOrderType = "OrderTYpe", FClientID = 1086, FOrderStatus = "ReadyToProduction" };
            EFContext context = new EFContext();

            context.tblOrders.Add(tblOrder);
            context.SaveChanges();
            scope.Dispose();
            int orderID = tblOrder.FOrderID;
            SqlConnection conn = new SqlConnection("****");
            string sql = $"INSERT INTO tblOrderSub (FOrderID,FMaterialID,FQty,FQtyShip,FFinishSKU,FModelCust,FColorCust)" +
                                    $" VALUES(@FOrderID,@FMaterialID,@FQty,@FQtyShip,@FFinishSKU,@FModelCust,@FColorCust)";
            SqlParameter[] sqlParameters =
                {
                    new SqlParameter("@FOrderID",orderID),
                    new SqlParameter("@FMaterialID",1),
                    new SqlParameter("@FQty",1),
                    new SqlParameter("@FQtyShip",1),
                    new SqlParameter("@FFinishSKU",false),
                    new SqlParameter("@FModelCust", "TEst"),
                    new SqlParameter("@FColorCust", "C1")
                };
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddRange(sqlParameters);
            conn.Open();
            cmd.ExecuteNonQuery();
            scope.Complete();
        }