public void AddTotest_main(test_main test_main) { base.AddObject("test_main", test_main); }
public static test_main Createtest_main(int id) { test_main test_main = new test_main(); test_main.id = id; return test_main; }
/// <summary> /// 基本的 查询 / 插入 / 更新 / 删除 处理. /// </summary> private static void BaseTest() { TestEntities context = new TestEntities(); // 单表查询 var query = from testMain in context.test_main select testMain; foreach (test_main main in query) { Console.WriteLine("Main[{0}, {1}]", main.id, main.value); } // 关联查询 var query2 = from testSub in context.test_sub where testSub.test_main.value == "ONE" select testSub; foreach (test_sub sub in query2) { Console.WriteLine("Sub[{0}, {1}]", sub.id, sub.value); } // 插入. test_main main3 = new test_main(); main3.id = 3; main3.value = "Three"; context.AddObject("test_main", main3); context.SaveChanges(); Console.WriteLine("INSERT FINISH!"); Console.ReadLine(); // 更新. var newTestMain = (from testMain in context.test_main where testMain.id == 3 select testMain).First(); newTestMain.value = "Three3"; context.SaveChanges(); Console.WriteLine("UPDATE FINISH!"); Console.ReadLine(); // 单表查询 TOP 2 var queryTop2 = (from testMain in context.test_main orderby testMain.id descending select testMain).Take(2); foreach (test_main main in queryTop2) { Console.WriteLine("Main[{0}, {1}]", main.id, main.value); } // 删除. context.DeleteObject(newTestMain); context.SaveChanges(); Console.WriteLine("DELETE FINISH!"); Console.ReadLine(); }
/// <summary> /// 应用对已分离对象的更改 /// </summary> private static void ApplyPropertyChangesTest() { Console.WriteLine("========== 应用对已分离对象的更改 =========="); TestEntities context = new TestEntities(); // 单表查询 test_main mainData = context.test_main.FirstOrDefault(p => p.id == 2); Console.WriteLine("Init: Main[{0}, {1}]", mainData.id, mainData.value); // 分离对象 // 在分离对象时,应考虑以下注意事项: // Detach 只影响传递给该方法的特定对象。如果要分离的对象在对象上下文中具有相关对象,则那些相关对象不会分离。 // 不会为已分离的对象维护关系信息。 // 分离对象后,不会维护对象状态信息。这包括所跟踪的更改和临时键值。 // 分离对象不影响数据存储区中的数据。 // 在分离操作过程中不会强制执行级联删除指令和引用约束。 // 在考虑分离对象的优点时,应该注意执行该操作所需的处理。当用户数据的范围已经更改(例如,用一组不同的数据显示新窗体)时,应该考虑创建一个新的 ObjectContext 实例,而不只是从现有 ObjectContext 分离对象。 context.Detach(mainData); // 上面的代码, 可以理解为: // 首先,从数据库检索出数据 // 然后,分离对象 // 分离后的对象, Context 不再管理了 // 主要应用于 服务器端, 查询数据以后, 不维持数据的变更管理 // 把数据 发送给客户端。 // 而客户端 拿到的数据, 相当于是 与 数据库无关的 // 因为对 “分离后的数据” 做任意修改 // 简单调用 SaveChanges 将不会更新数据库表中的数据。 // 分离对象的修改. mainData.value = "TwoTwo"; // 保持数据更改. context.SaveChanges(); // 再次查询, 数据没有发生任何变化. test_main mainData2 = context.test_main.FirstOrDefault(p => p.id == 2); Console.WriteLine("Detach and Save Main[{0}, {1}]", mainData2.id, mainData2.value); context.Detach(mainData2); // 下面是模拟 服务器端, 接收到一个 客户端的 更新请求时, 如何处理的例子. // 主键 EntityKey key; // 旧数据. object originalItem; using (TestEntities updateContext = new TestEntities()) { try { // 根据 修改后的数据, 获取其主键 (注意: 更新处理是只改数据,不修改主键的) key = updateContext.CreateEntityKey("test_main", mainData); // 尝试通过主键, 获取数据库中的数据. if (updateContext.TryGetObjectByKey(key, out originalItem)) { // 调用 ApplyPropertyChanges 方法,来更新数据. updateContext.ApplyPropertyChanges( key.EntitySetName, mainData); } updateContext.SaveChanges(); } catch (InvalidOperationException ex) { Console.WriteLine(ex.ToString()); } } // 再次查询, 数据发生变化. mainData2 = context.test_main.FirstOrDefault(p => p.id == 2); Console.WriteLine("ApplyPropertyChanges and Save Main[{0}, {1}]", mainData2.id, mainData2.value); // 最后改回原始情况 mainData2.value = "TWO"; context.SaveChanges(); }