我们是五月的花海 , 用青春拥抱时代 |

兴想事成

园龄:12年10个月粉丝:25关注:97

EF框架学习手记

转载: [ASP.NET MVC]: - EF框架学习手记

1、EF(Entity Framework)
实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。

2、什么是ORM?
ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的互相转换。
(表实体跟表之间的相互转换)
ORM框架有很多,EF框架是ORM框架的其中一种,是实现了ORM思想的框架。

O=>表实体
M=>映射关系
R=>数据库.表

3、创建EF,添加-新建项-ADO.NET 实体数据模型
<configuration>
  <!--必须紧跟着configuration下面添加-->
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <!--数据库连接字符串,使用EF必须添加providerName="System.Data.EntityClient"-->
  <connectionStrings>
    <add name="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=HX_Shop;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

4、简单的EF使用入门
 

复制代码
  //创建EF上下文
  Model.ModelContainer db = new Model.ModelContainer();  //下面有线程内实例唯一的例子
  UserInfo info = new UserInfo();
  info.Name = "张三";
  db.UserInfo.Add(info); //添加数据
  db.SaveChanges(); //最后必须SaveChanges()才能保存,把状态的实体映射回数据库。
  //info.Id = 1; //修改或删除操作,必须要有主键。
  //db.Entry<T>(entity).State = EntityState.Added;  //添加
  //db.Entry<T>(entity).State = EntityState.Modified;  //修改
  //db.Entry<T>(entity).State = EntityState.Deleted;  //删除
复制代码


4.1  EF4.0与EF5.0的写法区别。
查看代码

复制代码

public T AddEntity(T entity)
{
//EF4.0的写法
添加实体
//db.CreateObjectSet<T>().AddObject(entity);
//EF5.0的写法
db.Entry<T>(entity).State = EntityState.Added;
//下面的写法统一
db.SaveChanges();
return entity;
}
public bool UpdateEntity(T entity)
{
//EF4.0的写法
//db.CreateObjectSet<T>().Addach(entity);
//db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
//EF5.0的写法
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Modified;
return db.SaveChanges() > 0;
}
public bool DeleteEntity(T entity)
{
//EF4.0的写法
//db.CreateObjectSet<T>().Addach(entity);
//db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
//EF5.0的写法
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
return db.SaveChanges() > 0;
}

public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
{
//EF4.0的写法
//return db.CreateObjectSet<T>().Where<T>(whereLambda).AsQueryable();
//EF5.0的写法
return db.Set<T>().Where<T>(whereLambda).AsQueryable();
}
执行SQL语句
//EF4.0的写法
public int ExcuteSql(string sql, params ObjectParameter[] parameters)
{
return DbContext.ExecuteFunction(sql, parameters);
}
//EF5.0的写法
public int ExecuteSql(string sql, params System.Data.SqlClient.SqlParameter[] pars)
{
return DbContext.Database.ExecuteSqlCommand(sql, pars);
}

复制代码


5、增删改查练习
   

复制代码
public class BaseRepository<T> where T:class,new ()
    {
        private DbContext DbContext
        {
            get
            {
                return DbContextFactory.CreateDbContext(); //创建唯一实例。
            }
        }
        //简单查询
        public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
        {
            return DbContext.Set<T>().Where(whereLambda).AsQueryable();
        }
        //分页查询 ***
        public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int totalCount, Expression<Func<T, bool>> whereLambda, bool isAsc, Expression<Func<T, S>> orderBy)
        {
            IQueryable<T> result = DbContext.Set<T>().Where(whereLambda).AsQueryable();
            totalCount = result.Count();  //返回总记录条数
            if (isAsc)
            {
                result = result.OrderBy(orderBy)
                    .Skip(pageSize * (pageIndex - 1))
                    .Take(pageSize)
                    .AsQueryable();
            }
            else
            {
                result = result.OrderByDescending(orderBy)
                    .Skip(pageSize * (pageIndex - 1))
                    .Take(pageSize)
                    .AsQueryable();
            }
            return result;
        }

        public T Add(T entity)
        {
            DbContext.Set<T>().Add(entity);
            return entity;
        }

        public bool Detele(T entity)
        {
            DbContext.Entry(entity).State = EntityState.Deleted;
            return true;
        }

        public bool Update(T entity)
        {
            DbContext.Entry(entity).State = EntityState.Modified;
            return true;
        }
    }
复制代码


6、EF支持Database First、Model First和Code Only三种开发模式
database first :从数据库生成模型,先有数据库,根据数据库生成模型。
model first :由数据库生成的实体对象模型,先设计模型,再生成数据库。
code only : code first
http://www.cnblogs.com/fly_dragon/archive/2011/02/22/1961730.html
http://www.cnblogs.com/fcsh820/archive/2010/11/01/1866356.html

7、延迟加载机制
离线型的集合  <IQueryable>
延迟加载机制 用到这个集合时才会去加载数据(访问数据库)。

怎么避免延迟加载机制多次查询数据库的问题?
使用内存型集合ToList()  List<T>

8、Linq、Lambda表达式学习
http://www.cnblogs.com/han1982/tag/LINQ/


备注:
1、使用EF框架,EF的表必须有主键,没有会报错。
2、报错:对一个或多个实体的验证失败。实体属性赋值问题。
3、EF性能差,比ADO.NET多一步生成sql脚本,实现复杂查询生成的sql脚本。优点大于缺点。
3、EF上下文管理,保证线程内实例唯一。
//线程内部的一个内存空间
CallContext.SetData("DbContext")  //设置
CallContext.GetData("DbContext")  //获取实例 
HttpContext.Item["key"] 也是通过CallContext实现的
 

复制代码
    /// <summary>
    /// 保证EF的上下文。线程内实例唯一,一次请求一个实例、
    /// </summary>
    public static class DbContextFactory
    {
        public static DbContext CreateDbContext()
        {
            //线程内实例唯一
            DbContext db = (DbContext)HttpContext.Current.Items["DbContext"];
            if (db == null)
            {
                db = new Model.ModelContainer();
                HttpContext.Current.Items.Add("DbContext", db);
            }
            return db;
        }
    }
复制代码
posted @   兴想事成  阅读(324)  评论(5编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Good-bye My Loneliness ZARD
  2. 2 Say OK Vanessa Hudgens
  3. 3 All The Love In The World The Corrs
  4. 4 Adesso E Fortuna ~炎と永遠~ 加藤いづみ
Say OK - Vanessa Hudgens
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : BIRGISSON, ARNTHOR/KOTECHA, SAVAN

作曲 : Savan Kotecha/Arnthor Birgisson

Vanessa Hudgens - Say OK

Album: V

You are fine

You are fine

You are fine

You are fine

You are sweet

But I'm still a bit naive with my heart

When you're close I don't breathe

I can't find the words to speak

I feel sparks

But I don't wanna be into you

If you are not looking for true love, oh oh

No I don't wanna start seeing you

If I can't be your only one

So tell me when it's not alright

When it's not ok

Will you try to make me feel better?

Will you say alright? (say alright)

Will you say ok? (Say ok)

Will you stick with me through whatever?

Or run away

(Say that it's gonna be alright)

(That it's gonna be ok)

Say OK

When you call I don't know

If I should pick up the phone every time

I'm not like all my friends

Who keep calling up the boys, I'm so shy

But I don't wanna be into you

If you don't treat me the right way

See I can only start seeing you

If you can make my heart feel safe (feel safe)

When it's not alright

When it's not ok

Will you try to make me feel better?

Will you say alright? (say alright)

Will you say ok? (Say ok)

Will you stick with me through whatever?

Or run away

(Say that it's gonna be alright)

(That it's gonna be ok)

(Don't run away, don't run away)

Let me know if it's gonna be you

Boy, you've got some things to prove

Let me know that you'll keep me safe

I don't want you to run away so

Let me know that you'll call on time

Let me know that you won't be shy

Will you wipe my tears away

Will you hold me closer

When it's not alright

When it's not ok

Will you try to make me feel better

Will you say alright? (say alright)

Will you say ok? (Say ok)

Will you stick with me through whatever?

Or run away

(Say that it's gonna be alright)

(That it's gonna be ok)

Say OK

(Don't run away, don't run away)

(Say that it's gonna be alright)

(That it's gonna be ok)

(Don't run away)

Will you say OK

(Say that it's gonna be alright)

(That it's gonna be ok)

(Don't run away)

You are fine

You are fine