EF-实体框加基础(1)

来源:互联网 发布:淘宝刷话费教程 编辑:程序博客网 时间:2024/05/16 11:28

1.ORM对象关系映射ObjectRelational Mapping,简称ORM模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。

ORM技术特点:

        1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。

        2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

ORM原理

       在对对象做持久化时,ORM一般会持久化所有的属性。如:

   实体类的属性名:Name -> 数据库字段名:SName

   实体类的属性名:Age->数据库字段名:SAge

    接下来的工作就是:怎样根据这种方法动态地从对象中获取映射规则,然后动态构造InsertUpdateDeleteSQL语句。这就是实现自己的ORM的原理。


ORM缺点:

ORM的缺点是会牺牲程序的执行效率和会固定思维模式系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低
 ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理,这样就容易产生性能问题。
自己实现ORM
public class BLLUser   {       public bool InsertItem(User model)       {           bool ifInsert = false;           string strInsert = "Insert into User(Login, Email, Mobile, Password, Nickname, Status) Values(" + model.Login + "," + model.Email + "," + model.Mobile + "," + model.Password + "," + model.Nickname + "," + model.Status + ")";           if (SQLHelper.ExecuteSql(strInsert> 0)           {               ifInsert = true;           }            return ifInsert;       }       public IList<User> GetList()       {           List<User> list = new List<User>();           string strSql = "SELECT * FROM User";           DataSet ds = SQLHelper.Query(strSql);            //下面做实体映射           if (ds.Tables[0].Rows.Count > 0)           {               User model;               foreach (DataRow row in ds.Tables[0].Rows)               {                   model = new User();                   model.Id = Convert.ToInt32(row["Id"]);                   model.Login = Convert.ToString(row["Login"]);                   model.Email = Convert.ToString(row["Email"]);                   model.Mobile = Convert.ToString(row["Mobile"]);                   model.Password = Convert.ToString(row["Password"]);                   model.Nickname = Convert.ToString(row["Nickname"]);                   model.Status = Convert.ToInt32(row["Status"]);                   list.Add(model);               }           }           return list;        }   }

二、微软ORM框架EntityFramework

实体框架EntityFrameworkADO.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中的实体数据模型(EDM)由以下三种模型

 (1) 概念层:负责向上的对象与属性显露与访问。

 (2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起。

 (3) 储存层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider一起,负责实际对数据库的访问和 SQL 的产生。



三.实体框加创建应用,创建和添加很简单,下面使用创建的实体框架获取数据


MallEntities me = new MallEntities();            me.Book.Intersect<Book>(list);            var item = me.Book;            IEnumerable < Book > list1= me.Book;
MallEntities继承自DbContext,DBContext和ObjectContext相似

ObjectContext封装 .NETFramework和数据库之间的连接。此类用作“创建”、“读取”、“更新”和“删除”操作的

Ø将所有更新持久保存到存储区中。

    SaveChanges()

    AcceptAllChanges()


使用生成的ef查看列表,EFModel是实体数据模型,用code first生成的数据模型结构,除了类就多了一个EFModel,要拿到数据表toList从数据库中查出来



EFModel ef = new EFModel();           //string str = ef.Database.Connection.ConnectionString;           //Response.Write(str);           DGdata.DataSource = ef.User.ToList();           DGdata.DataBind();

数据的增删改查都一样


新版实体框加ef5.0或者6.0,使用Add增加数据,实体框架中具体属性的类型是DbSet<TEntity>

DbSet<TEntity>


MallEntities me = new MallEntities();           User user=new User{Login="dddddddddddd",Mobile="dddddd",Email="dd",Nickname="dd",Password="dd",Status=1};           me.User.Add(user);           me.SaveChanges();删除数据
me.User.Remove(me.User.FirstOrDefault());me.SaveChanges();
修改数据,更改了第一条数据的Login
me.User.FirstOrDefault().Login = "4";            me.SaveChanges();DbSet方法介绍 Add将给定实体以“已添加”状态添加到集的基础上下文中,这样一来,当调用 SaveChanges 时,会将该实体插入到数据库中。公共方法AddRange将给定实体集合添加到基础化集的上下文中(每个实体都置于“已添加”状态),这样当调用 SaveChanges 时,会将它插入到数据库中。 Remove将给定实体标记为“已删除”,这样一来,当调用 SaveChanges 时,将从数据库中删除该实体。 请注意,在调用此方法之前,该实体必须以另一种状态存在于该上下文中。 具体方法请参考文档



在ef4中增删改查用

public partial class WebForm2 : System.Web.UI.Page       {           TestEntities te = new TestEntities();            protected void Page_Load(object senderEventArgs e)           {               //string strcon = te.Connection.ConnectionString;               //Response.Write(strcon);               //UserInfo u = new UserInfo();           }           //添加一条数据记录           protected void Button1_Click(object senderEventArgs e)           {               ObjectSet<UserInfo> obSet = te.CreateObjectSet<UserInfo>();               UserInfo u =0 new UserInfo();               u.UserName = "ti";               u.UserPwd = "126";               obSet.AddObject(u);//添加一条数据               te.SaveChanges();//将所有的更新提交到数据库中。               Response.Write("操作成功");           }           //删除一条记录           protected void Button2_Click(object senderEventArgs e)           {               ObjectSet<UserInfo> obSet = te.CreateObjectSet<UserInfo>();               UserInfo ui = te.UserInfo.FirstOrDefault();               obSet.DeleteObject(ui);//删除一条数据               te.SaveChanges();//将所有的更新提交到数据库中。               Response.Write("操作成功");           }           //更新一条数据记录           protected void Button3_Click(object senderEventArgs e)           {               ObjectSet<UserInfo> obSet = te.CreateObjectSet<UserInfo>();               UserInfo ut = te.UserInfo.FirstOrDefault();               ut.UserName = "opkl";               ut.UserPwd = "098";               te.SaveChanges();//将更新的数据提交到数据库中               Response.Write("操作成功");           }       }


0 0
原创粉丝点击