ORM/EF 几种模式

3 篇文章 0 订阅
1 篇文章 0 订阅

小记录:

1.DBFirst  先有DB 利用DB生成 .edmx文件 (生成的东西 代码繁杂 )

 

2.ModelFirst 和 DBFisrt相反的一种模式 ,现有 直接在VS里面 建模型 然后生成库, 生成时 要执行SQL 语句才会生效

 

3.CodeFisrt  (2种模式-)

3.1     利用DB 生成 干净的 对应库的 类  (这种最推荐    干净 简洁    可以 通过 类的 属性映射  指定重新 指定表名  列名   等属性)

3.2     利用类生成数据库

注:CodeFirst+EF时 如何保证EFDbContext 上下文唯一,这个是关键

第一种:经典写法,对应的使用数据查询时 就是使用using(){}

 public CodeFirstDBEntitiesDbContext() : base("name=CodeFirstDBEntities"){
 
}

第二种:利用数据槽的方式,看到很多企业级项目这么用:

来源参考:https://blog.csdn.net/q646926099/article/details/52384233

        public static DbContext GetCurrentDbContext(){

            //CallContext:是线程内部唯一的独用的数据槽(一块内存空间)
            //传递DbContext进去获取实例的信息,在这里进行强制转换。
            DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
 
            if (dbContext == null)  //线程在内存中没有此上下文
            {
                //如果不存在上下文 创建一个(自定义)EF上下文  并且放在数据内存中去
                dbContext = new BaseDBContext();
                CallContext.SetData("DbContext", dbContext);
            }
            return dbContext;
        }

         public BaseRepository(){

            this.db = DbContextFactory.GetCurrentDbContext();
            this.dbSet = db.Set<TEntity>();
        }

        public class EFNewsPaperGroupRepository : BaseRepository<Models.NewsPaperGroup>, INewsPaperGroupRepository{
       
        public IQueryable<Models.NewsPaperGroup> NewsPaperGroup
        {
            get
            {
                return Entities;
            }
        }
    }
        public interface INewsPaperGroupRepository{

            IQueryable<Models.NewsPaperGroup> NewsPaperGroup { get; }

            bool Save(Models.NewsPaperGroup model);

            bool Delete(Models.NewsPaperGroup model);

		    bool Update(Models.NewsPaperGroup model);
    }

第三种:使用HttpContext:来源参考:https://blog.csdn.net/chwenbin/article/details/79110737

public class DbContextHelper
{
    /// <summary>
    /// 创建DBContext对象,并存放到HttpContext.Current.Items集合中。
    /// </summary>
    /// <returns></returns>
    public static T CreateDbContext<T>(string key) where T : class, new()
    {
        T context = HttpContext.Current.Items[key] as T;
        if (context == null)
        {
            context = new T();
            HttpContext.Current.Items.Add(key, context);
        }
        return context;
    }
 
    /// <summary>
    /// 释放DBContext对象
    /// </summary>
    public static void DisposeDbContext(string key)
    {
        if (HttpContext.Current.Items.Contains(key))
        {
            HttpContext.Current.Items.Remove(key);
        }
    }
 
}

后面两种方法我不是很懂,欢迎大神赐教,后面也会去实现的

 

下面这篇博客地址 也可很好的帮助理解:

https://www.cnblogs.com/jihua/archive/2013/05/23/efmoshi.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值