• ADO.NET实体数据模型使用探索1


    今天研究了下ADO.NET实体数据模型,想写个关于两张有外键关系的增改删查,以此来稍增加点难度。

    编程环境:vs2010+sql2005

    1.在SQL2005下建立三张表:学生信息表Student(Snno,Sname,Age),课程信息表Course(Cno,Cname),选课表SC(Sno,Cno)(Sno,Cno分别为外键)除AGE为整形外,其他都为字符串型。

    2.打开VS2010,建立c#控制台程序,新建---新建项---ADO.NET实体数据模型,文件名默认为Model1.edmx---确定---选择本机数据库----选择港建立的数据库的3张表,OK。

    EDMX图形:

    可能新同学觉得奇怪,这么没有SC表了?!不过多了导航的东西。其实SC表因为只是Student和Course的外键,所以可以通过Stu对象找到对应的Course对象。(源代码见Model1.Designer.cs)。具体原理各位百度下,这里就不细说了。

    直接上控制台程序内部的Main()方法:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 
      6 namespace System_EntityObjectTest
      7 {
      8     class Program
      9     {
     10         static void Main(string[] args)
     11         {
     12             testEntities db = new testEntities();
     13 
     14             #region 查询所有学生信息记录并输出
     15             //查询所有学生信息记录并输出,支持动态延迟查询
     16             var query = db.Stu;
     17             ShowStu(query);
     18             #endregion
     19 
     20             #region 增加一条学生记录及该生的选课记录
     21             //增加一条学生记录及该生的选课记录
     22             Stu stu1 = new Stu() { Sno = "001", Sname = "niulinhua", Age = 21 };  //亦可Stu s = db.Stu.CreateObject();之后再对象属性赋值
     23             stu1.Course.Add(new Course() { Cno = "001", Cname = "math" });
     24             db.Stu.AddObject(stu1);
     25             db.SaveChanges();
     26             ShowStu(query);
     27             #endregion
     28 
     29             #region 查询学号001的学生的所有选课
     30             //查询学号001的学生的所有选课
     31             var stu2 = db.Stu.Where(s => s.Sno == "001").SingleOrDefault();
     32             foreach (var item in stu2.Course)
     33             {
     34                 Console.WriteLine(stu2.Sname + "," + item.Cname);
     35             }
     36             Console.WriteLine();
     37             #endregion
     38             
     39             #region 修改学生年龄,并查看对象状态
     40             //修改学生年龄,并查看对象状态
     41             var stu3 = db.Stu.Where(s => s.Sno == "001").First();
     42             Console.WriteLine(stu3.EntityState.ToString());
     43             stu1.Age = -1;
     44             Console.WriteLine(stu3.EntityState.ToString());
     45             db.SaveChanges();
     46             Console.WriteLine(stu3.EntityState.ToString());
     47             ShowStu(query);
     48             #endregion
     49 
     50             #region 删除学号001的学生所有记录,包括选课信息
     51             //删除学号001的学生所有记录,包括选课信息
     52             var stu4 = db.Stu.Where(s => s.Sno == "001").SingleOrDefault();
     53             //1.删除该生所有选课信息
     54             //EF实际无SC表,处理为删除实体关系
     55             stu4.Course.Clear();
     56             //或者手动逐个清楚
     57             //for (int i = 0; i < stu3.Course.Count; i++)
     58             //{
     59             //    stu3.Course.Remove(stu3.Course.ElementAt(i));
     60             //}
     61             //不能用foreach(),因为它不允许集合更改
     62             //foreach (var item in stu.Course)
     63             //{
     64             //    stu.Course.Remove(item);
     65             //}
     66             //2.删除学生个人信息
     67             db.Stu.DeleteObject(stu3);
     68             db.SaveChanges();
     69             ShowStu(query);
     70             #endregion
     71 
     89             Console.Read();
     90         }
     91 
     92         private static void ShowStu(System.Data.Objects.ObjectSet<Stu> query)
     93         {
     94             foreach (var item in query)
     95             {
     96                 Console.WriteLine(item.Sno + "    " + item.Sname + "  " + item.Age);
     97             }
     98             Console.WriteLine();
     99         }
    100     }
    101 }

    代码有点乱,在下水平有限,不过各位应该还是能读懂的。

    这段代码操作了三张表(S,C,SC表),并建立了相关联系。对有外键的表操作时要小心,否则会引发数据库错误.总之,各位理解下便知。

    好了,对这三张表的增改删查到此OK。

    另外推荐各有用的的数据库小工具:sql server profile,SQL2005自带(工具---sql server profile),可以方便的看到连接到此数据库的信息,包括连接名,时间,命令等,可以用来观察LINQ或EF等最终生成的SQL语句,也有利于优化。

  • 相关阅读:
    jmeter压力测试报错:java.net.BindException: Address already in use: connect
    C# 对话框总结(转载)
    C# 文件操作方法大全(转载)
    C#实现进度条progress control(转载)
    在Windows下架设FTP服务器
    .Net环境下,使用installutil.exe注册、删除windows服务
    用双网卡实现跨网段访问(转载)
    HTTP协议详解(转载)
    学习开发web服务(转载)
    C# 实现http协议的GET和POST请求(转载)
  • 原文地址:https://www.cnblogs.com/nlh774/p/3448206.html
Copyright © 2020-2023  润新知