Example #1
0
        /// <summary>
        /// 创建新的 TEST_SUB 对象。
        /// </summary>
        /// <param name="id">ID 属性的初始值。</param>
        public static TEST_SUB CreateTEST_SUB(global::System.Decimal id)
        {
            TEST_SUB tEST_SUB = new TEST_SUB();

            tEST_SUB.ID = id;
            return(tEST_SUB);
        }
        /// <summary>
        /// 测试 不 调用 SaveChanges 方法。
        /// 调用存储过程, 是否会更新数据。
        /// </summary>
        private static void TestWithOutSaveChanges()
        {
            Console.WriteLine("测试调用存储过程!");

            using (TestEntities context = new TestEntities())
            {
                Console.WriteLine("调用插入数据的存储过程!");
                context.TestInsertMainSub("procMain2", "procSub2");
            }

            Console.WriteLine("查询数据!  看看在调用存储过程后, 没有执行 SaveChanges, 是否实际更新了数据!");



            decimal mainID = 0;

            using (TestEntities context = new TestEntities())
            {
                TEST_MAIN mainData = context.TEST_MAIN.FirstOrDefault(p => p.VALUE == "procMain2");
                if (mainData != null)
                {
                    mainID = mainData.ID;
                    Console.WriteLine("Main: ID = {0}; VALUE = {1}", mainData.ID, mainData.VALUE);
                }
                else
                {
                    Console.WriteLine("Main 数据不存在!");
                }


                TEST_SUB subData = context.TEST_SUB.FirstOrDefault(p => p.VALUE == "procSub2");
                if (subData != null)
                {
                    Console.WriteLine("SUB: ID = {0}; VALUE = {1}", subData.ID, subData.VALUE);
                }
                else
                {
                    Console.WriteLine("Sub 数据不存在!");
                }


                if (mainID != 0)
                {
                    // 没有 SaveChanges
                    // 但是数据还是更新了.
                    context.TestRemoveMainSub(mainID);
                }
            }
        }
        // 在 EF 中使用存储过程的操作步骤如下:
        // 1. 首先, 在数据库中,创建好 存储过程,并 编译通过。
        // 2. 在 edmx 中,选择 “从数据库更新模型”, 将数据库中的存储过程导入
        // 3. 在 edmx 空白区域  鼠标右键, 弹出菜单中选择 “添加 -- 函数导入”
        // 4. 保存 edmx 后, 在 生成的代码中,应该包含新增的 存储过程.



        /// <summary>
        /// 正常的测试.
        /// </summary>
        private static void TestNormal()
        {
            Console.WriteLine("测试调用存储过程!");

            using (TestEntities context = new TestEntities())
            {
                Console.WriteLine("调用插入数据的存储过程!");
                context.TestInsertMainSub("procMain", "procSub");


                Console.WriteLine("查询数据,查看存储过程是否成功执行!");
                TEST_MAIN mainData = context.TEST_MAIN.FirstOrDefault(p => p.VALUE == "procMain");
                Console.WriteLine("Main: ID = {0}; VALUE = {1}", mainData.ID, mainData.VALUE);

                TEST_SUB subData = context.TEST_SUB.FirstOrDefault(p => p.VALUE == "procSub");
                Console.WriteLine("SUB: ID = {0}; VALUE = {1}", subData.ID, subData.VALUE);



                Console.WriteLine();
                Console.WriteLine("调用删除数据的存储过程!");

                decimal mainID = mainData.ID;

                context.TestRemoveMainSub(mainID);
                Console.WriteLine("查询数据,查看存储过程是否成功执行!");



                mainData = context.TEST_MAIN.FirstOrDefault(p => p.ID == mainID);
                if (mainData == null)
                {
                    Console.WriteLine("Main 数据已被删除!");
                }
                subData = context.TEST_SUB.FirstOrDefault(p => p.MAIN_ID == mainID);
                if (subData == null)
                {
                    Console.WriteLine("Sub 数据已被删除!");
                }


                context.SaveChanges();
            }
        }
        /// <summary>
        /// 测试 正常的调用 + 存储过程调用
        /// </summary>
        private static void TestCallProc()
        {
            Console.WriteLine();
            Console.WriteLine("开始测试 事务处理 (先调用存储过程, 后添加数据)...");



            // 注意: 运行的时候,可能会提示。
            // 无法启动此程序,因为计算机中丢失 MSVCRTD.dll
            // 忽略对话框, 直接按确定按钮以后, 程序可正常执行。


            // 在某些有 VC ++ 开发工具的计算机上面, 可以找到这个 MSVCRTD.dll  文件.
            // 从那些机器上复制下来,粘贴到 C:\Windows\system32  ( 64 位系统,复制到  C:\Windows\SysWOW64 )
            // 然后再运行,将没有上面的问题。

            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    using (TestEntities context = new TestEntities())
                    {
                        Console.WriteLine("调用插入数据的存储过程!");
                        context.TestInsertMainSub("procMain2", "procSub2");

                        TEST_MAIN testData = new TEST_MAIN()
                        {
                            ID    = 99,
                            VALUE = "测试事务处理."
                        };
                        context.TEST_MAIN.AddObject(testData);
                        context.TEST_MAIN.AddObject(testData);


                        // 注意, 这里  调用  SaveChanges 方法时, 传入的参数是  false.
                        context.SaveChanges(false);

                        scope.Complete();

                        // 调用 AcceptAllChanges 意味着 真正地更新了数据库的数据.
                        context.AcceptAllChanges();
                    }
                }
            }
            catch
            {
                Console.WriteLine("异常发生了,数据更改回滚!");
                Console.WriteLine("当前数据库中,TEST_MAIN 表应当没有 ID = 99 的 数据。");

                using (TestEntities context = new TestEntities())
                {
                    TEST_MAIN mainData = context.TEST_MAIN.FirstOrDefault(p => p.ID == 99);

                    if (mainData == null)
                    {
                        Console.WriteLine("数据核对成功,TEST_MAIN 表没有 ID = 99 的 数据。");
                    }
                    else
                    {
                        Console.WriteLine("数据核对失败,TEST_MAIN 表有 ID = 99 的 数据。");
                    }



                    decimal mainID = 0;

                    mainData = context.TEST_MAIN.FirstOrDefault(p => p.VALUE == "procMain2");
                    if (mainData != null)
                    {
                        mainID = mainData.ID;
                        Console.WriteLine("Main: ID = {0}; VALUE = {1}", mainData.ID, mainData.VALUE);
                    }
                    else
                    {
                        Console.WriteLine("Main 数据不存在!");
                    }


                    TEST_SUB subData = context.TEST_SUB.FirstOrDefault(p => p.VALUE == "procSub2");
                    if (subData != null)
                    {
                        Console.WriteLine("SUB: ID = {0}; VALUE = {1}", subData.ID, subData.VALUE);
                    }
                    else
                    {
                        Console.WriteLine("Sub 数据不存在!");
                    }


                    if (mainID != 0)
                    {
                        // 没有 SaveChanges
                        // 但是数据还是更新了.
                        context.TestRemoveMainSub(mainID);
                    }
                }
            }

            Console.WriteLine();
        }
Example #5
0
 /// <summary>
 /// 用于向 TEST_SUB EntitySet 添加新对象的方法,已弃用。请考虑改用关联的 ObjectSet&lt;T&gt; 属性的 .Add 方法。
 /// </summary>
 public void AddToTEST_SUB(TEST_SUB tEST_SUB)
 {
     base.AddObject("TEST_SUB", tEST_SUB);
 }
 /// <summary>
 /// 用于向 TEST_SUB EntitySet 添加新对象的方法,已弃用。请考虑改用关联的 ObjectSet&lt;T&gt; 属性的 .Add 方法。
 /// </summary>
 public void AddToTEST_SUB(TEST_SUB tEST_SUB)
 {
     base.AddObject("TEST_SUB", tEST_SUB);
 }
 /// <summary>
 /// 创建新的 TEST_SUB 对象。
 /// </summary>
 /// <param name="id">ID 属性的初始值。</param>
 public static TEST_SUB CreateTEST_SUB(global::System.Decimal id)
 {
     TEST_SUB tEST_SUB = new TEST_SUB();
     tEST_SUB.ID = id;
     return tEST_SUB;
 }