/// <summary> /// 测试 不 调用 SaveChanges 方法。 /// 调用存储过程, 是否会更新数据。 /// </summary> private static void TestWithOutSaveChanges() { Console.WriteLine("测试调用存储过程!"); using (TestEntities context = new TestEntities()) { Console.WriteLine("调用插入数据的存储过程!"); context.TestInsertMainSub("procMain2", "procSub2"); } Console.WriteLine("查询数据! 看看在调用存储过程后, 没有执行 SaveChanges, 是否实际更新了数据!"); int 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); } } Console.WriteLine(); }
// 在 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("调用删除数据的存储过程!"); int 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(); } }
// 在 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("调用删除数据的存储过程!"); int 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> /// 测试 不 调用 SaveChanges 方法。 /// 调用存储过程, 是否会更新数据。 /// </summary> private static void TestWithOutSaveChanges() { Console.WriteLine("测试调用存储过程!"); using (TestEntities context = new TestEntities()) { Console.WriteLine("调用插入数据的存储过程!"); context.TestInsertMainSub("procMain2", "procSub2"); } Console.WriteLine("查询数据! 看看在调用存储过程后, 没有执行 SaveChanges, 是否实际更新了数据!"); int 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); } } Console.WriteLine(); }
/// <summary> /// 测试 正常的调用 + 存储过程调用 /// </summary> private static void TestCallProc() { Console.WriteLine(); Console.WriteLine("开始测试 事务处理 (先调用存储过程, 后添加数据)..."); // 注意: 运行的时候 // 如果是 Oracle 数据库, 会提示 // 无法启动此程序,因为计算机中丢失 MSVCRTD.dll // 忽略对话框, 直接按确定按钮以后, 程序可正常执行。 // 对于 SQL Server 数据库来说, 则没有这个问题. 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(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave); 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 的 数据。"); } int 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(); }
/// <summary> /// 测试 正常的调用 + 存储过程调用 /// </summary> private static void TestCallProc() { Console.WriteLine(); Console.WriteLine("开始测试 事务处理 (先调用存储过程, 后添加数据)..."); // 注意: 运行的时候 // 如果是 Oracle 数据库, 会提示 // 无法启动此程序,因为计算机中丢失 MSVCRTD.dll // 忽略对话框, 直接按确定按钮以后, 程序可正常执行。 // 对于 SQL Server 数据库来说, 则没有这个问题. 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(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave); 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 的 数据。"); } int 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(); }