EF学习笔记——通用增删改查方案

35 篇文章 0 订阅

我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能。以往用过一些ORM方法,尽管有代码生成器,但代码量总的来说比较多。这次采用EF,我就想,能不能尽量写出一些通用的方法,以后添加表、实体类,只需做很少的改动,就能拥有基本的增删改查功能呢?

方案如下:

1、分为几个部分:BLL、DAL、Model、Interface。其中,EF生成的代码放在Model。因为不想由BLL直接操作Model,因此还是增加一个DAL,由它来对EF的方法作进一步的封装,供BLL调用。至于接口,则是出于如下考虑:增删改查,BLL和DAL都需要实现,因此它们最好实现同一接口;最重要的,因为使用了接口,在BLL中,方便调用DAL对象。

这几个部分分别介绍如下:

1、接口Interface

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

    public interface IEntity  
    {  
        long _ID { get;}  
    }  

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

   public interface ICommon<T> where T : class,IEntity  
    {  
        T Add(T model);  
        T Update(T model);  
        void Delete(T model);  
        //按主键删除,keyValues是主键值  
        void Delete(params object[] keyValues);  
        //keyValues是主键值  
        T Find(params object[] keyValues);  
        List<T> FindAll();  
    }  

2、DAL

通用的增删改查代码:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

    public abstract class BaseCommon<T> : Interface.ICommon<T> where T : class,Interface.IEntity  
    {  
        DbContext db;  
        public BaseCommon(DbContext context)  
        {  
            this.db = context;  
        }  

        public DbContext Context  
        {  
            get  
            {  
                return db;  
            }  
        }  

        #region ICommon<T>  
        public T Add(T model)  
        {  
            db.Set<T>().Add(model);  
            db.SaveChanges();  
            return model;  
        }  
        public T Update(T model)  
        {  
            if (db.Entry<T>(model).State == EntityState.Modified)  
            {  
                db.SaveChanges();  
            }  
            else if (db.Entry<T>(model).State == EntityState.Detached)  
            {  
                try  
                {  
                    db.Set<T>().Attach(model);  
                    db.Entry<T>(model).State = EntityState.Modified;  
                }  
                catch (InvalidOperationException)  
                {  
                    T old = Find(model._ID);  
                    db.Entry(old).CurrentValues.SetValues(model);  
                }  
                db.SaveChanges();  
            }  
            return model;  
        }  
        public void Delete(T model)  
        {  
            db.Set<T>().Remove(model);  
            db.SaveChanges();  
        }  
        public void Delete(params object[] keyValues)  
        {  
            T model = Find(keyValues);  
            if (model != null)  
            {  
                db.Set<T>().Remove(model);  
                db.SaveChanges();  
            }  
        }  
        public T Find(params object[] keyValues)  
        {  
            return db.Set<T>().Find(keyValues);  
        }  
        public List<T> FindAll()  
        {  
            return db.Set<T>().ToList();  
        }  
        #endregion  
    }  

这里面,已经封装好了一般的增删改查方法。而对应数据库每个表对象的那些类,只需继承这个BaseCommon类,即可拥有增删改查功能。如:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

    public partial class TableA : BaseCommon<Model.TableA> { }  

这样,TableA对象会自然拥有增删改查功能。假如需要扩充它的功能,我们可以再写一个TableA的分部类。

以后,新增一个表TableB,在DAL这里,一般情况下只需新增一句:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

    public partial class TableB : BaseCommon<Model.TableB> { }  

是不是很方便?

3、BLL

BLL是供UI层,或者上一层调用的,因此,它每个对象,也应该有增删改查的基本功能。当然,BLL无须直接实现,是通过调用DAL来实现:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

    public abstract class Common<TDAL, TModel> : Interface.ICommon<TModel>  
            where TDAL : class ,new()  
            where TModel : class ,Interface.IEntity   
        {  
            protected TDAL dal;  
            private Interface.ICommon<TModel> common;  

            public Common()  
            {  
                dal = new TDAL();  
                common = (Interface.ICommon<TModel>)dal;  
            }  

            #region ICommon<TModel>  
            public TModel Add(TModel model)  
            {  
                return common.Add(model);  
            }  
            public TModel Update(TModel model)  
            {  
                return common.Update(model);  
            }  
            public void Delete(TModel model)  
            {  
                common.Delete(model);  
            }  
            public void Delete(params object[] keyValues)  
            {  
                common.Delete(keyValues);  
            }  
            public TModel Find(params object[] keyValues)  
            {  
                return common.Find(keyValues);  
            }  
            public List<TModel> FindAll()  
            {  
                return common.FindAll();  
            }  
            #endregion  
        }  

与DAL类似,TableA对象在这里是这样的:

[csharp] view plaincopy在CODE上查看代码片派生到我的代码片

    public partial class TableA : Common<DAL.TableA, Model.TableA> { }  

同理,如果以后新增了表TalbeB,在这里也只是新增一句而已。

这里还有一个好处,就是对外界调用而言,根本不需要知道泛型,就是一个 TableA table = new TalbeA();就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EF(Entity Framework)是.NET Framework中的一种ORM(Object Relational Mapping)框架,可以用来简化数据库操作。下面是使用EF Web API进行增删改查的示例代码: 1. 增加数据: ```csharp [HttpPost] public async Task<IActionResult> AddData([FromBody] Data data) { if (!ModelState.IsValid) { return BadRequest(ModelState); } _context.Data.Add(data); await _context.SaveChangesAsync(); return CreatedAtAction(nameof(GetData), new { id = data.Id }, data); } ``` 2. 删除数据: ```csharp [HttpDelete("{id}")] public async Task<IActionResult> DeleteData(int id) { var data = await _context.Data.FindAsync(id); if (data == null) { return NotFound(); } _context.Data.Remove(data); await _context.SaveChangesAsync(); return NoContent(); } ``` 3. 修改数据: ```csharp [HttpPut("{id}")] public async Task<IActionResult> UpdateData(int id, [FromBody] Data data) { if (id != data.Id) { return BadRequest(); } _context.Entry(data).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!_context.Data.Any(e => e.Id == id)) { return NotFound(); } else { throw; } } return NoContent(); } ``` 4. 查询数据: ```csharp [HttpGet("{id}")] public async Task<ActionResult<Data>> GetData(int id) { var data = await _context.Data.FindAsync(id); if (data == null) { return NotFound(); } return data; } ``` 以上是EF Web API进行增删改查的示例代码,需要注意的是,这只是示例代码,具体实现还需要根据具体的业务逻辑进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值