Entity Framework 学习——了解

        ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。
        ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。

ADO.NET Entity Framework自.NET 3.5以来就被集成于.NET中,现在最新版本是Entity Framework 5.0。
版本
支持.NET
发布情况
备注
Entity Framework 3.5
2.0+
包含于.NET 3.5中
支持EDMX生成,通过扩展可支持POCO类的生成
Entity Framework 4.0
4.0+
包含于.NET 4.0中
Entity Framework 4.X
4.0+
可通过NuGet获取
支持Database First、Model First、Code First三种生
成模式
Entity Framework 4.5
4.5+
集成于.NET 4.5中
Entity Framework 5.X
4.5+
可通过NuGet获取
支持枚举字段,性能有较大提升,支持.NET 4.0的版本
为Entity Framework 4.4

        以上从百度百科摘来的,简单说就是一种ORM框架。

        以前编程都是原生的ADO.NET,步骤实在繁琐,开发效率也不高,小项目小系统性能上的优势又不明显,维护起来也很累。草根创业的初期,公司开发人员可能就1个,没有专门的美工、DBA等。能最快开发出东西才是王道,同时又要灵活可扩展规范,这需要技术人员基础扎实、学习能力强、需要什么学习什么,马上用什么。这几天学习了下EF发现优点挺多,可以认真关注于开发、更快的开发出一个小型项目。对比下ADO.NET  EF的Database-first Model-first Code-first 开发一个简单应用:

image

简单的一个登录表。

ADO.NET 登录代码如下:

private static void Main(string[] args)
        {
            while (true)
            {
                string username;
                string password;
                string sqlstr = "server=.;uid=sa;pwd=sa;database=Test";
                Console.WriteLine("请输入用户名:");
                username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                password = Console.ReadLine();
                using (SqlConnection conn = new SqlConnection(sqlstr))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = conn;
                        cmd.CommandText = "select COUNT(*) from LoginUser where " +
                                          "username=@username and password=@password";
                        cmd.Parameters.Add(new SqlParameter("@username ", username));
                        cmd.Parameters.Add(new SqlParameter("@password ", password));
                        conn.Open();
                        int result = (int)cmd.ExecuteScalar();
                        if (result > 0)
                        {
                            Console.WriteLine("登录成功。");
                        }
                        else
                        {
                            Console.WriteLine("登录失败。");
                        }
                    }
                }
            }
        }

image

DataBase-first(数据库先行):

image

第一步:在项目里面添加一个ADO.NET 实体数据模型

image

image

image

添加完成后,主程序代码如下:

static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("请输入用户名:");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                TestEntities dbcontext = new TestEntities();
                var result = (from r in dbcontext.LoginUser
                    where r.UserName == username && r.PassWord == password
                    select r).SingleOrDefault();
                if (result !=null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

image

核心代码少了好多,直接写上linq查询语句,其他交给EF处理。

Model-first 模型先行,数据库可以先不用建立,直接在VS里面建模然后生成到数据库。

还是添加ADO.NET实体模型,不过选择空模型:

image

在模型界面空白处右击,弹出如下菜单,选择 新增-》实体。

image

image

接着在新增加的实体上面右击,选择添加 标量。

imageimage按下 F4 可以在属性窗口设置 类型,是否可空,以及最大长度等。

添加完全部的 标量后 ,在空白地方单击右键:

image

image

点击完成后,在资源管理器里面会多出一个:Model1.edmx.sql文件。然后空白地方右击

image

一执行数据库里面就会多新增加的LoginUser2表。

代码如下,新建立的表没有数据,顺便添加了一个用户:

static void Main(string[] args)
        {
            Model1Container dbcontext = new Model1Container();
            LoginUser2 newuser = new LoginUser2();
            newuser.UserName = "sa";
            newuser.PassWord = "sa";
            dbcontext.Entry(newuser).State = EntityState.Added;
            dbcontext.SaveChanges();
            while (true)
            {
                Console.WriteLine("请输入用户名:------ModelFirst----------");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                var result = (from r in dbcontext.LoginUser2
                              where r.UserName == username && r.PassWord == password
                              select r).SingleOrDefault();
                if (result != null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

image

接下来就是最适合新的中小项目开发的Code-first,直接写代码:

第一步:添加模型类(loginuser3.cs),添加DataAnnotations引用

image

接下来:添加一个Context 类,添加EF5.0的引用,同时在APP.CONFIG里面添加数据库的连接字符串testlogin。

image

好了,这样就OK了,接下来就是写代码了。

 static void Main(string[] args)
        {
            LoginContext dbcontext = new LoginContext();
            dbcontext.Database.CreateIfNotExists();//如果没有数据库就创建一个
            LoginUser3 newuser = new LoginUser3();
            newuser.UserName = "sa";
            newuser.PassWord = "sa";
            dbcontext.Entry(newuser).State = EntityState.Added;
            dbcontext.SaveChanges();
            while (true)
            {
                Console.WriteLine("请输入用户名:------CodeFirst----------");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                var result = (from r in dbcontext.Loginuser
                              where r.UserName == username && r.PassWord == password
                              select r).SingleOrDefault();
                if (result != null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

运行后会发现,多出来了LoginUser3这个表。

image