博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF的Repository设计模式实例
阅读量:4684 次
发布时间:2019-06-09

本文共 2767 字,大约阅读时间需要 9 分钟。

个人理解:

在mvc开发中,数据映射层使用Repository设计模式,可以通过使用接口和泛型来把一些公共的调用数据库的方法抽象出来,以降低系统模块的耦合性和减少冗余的代码。

提高了代码的可维护性和扩展性,同时不会影响到业务逻辑层和视图。

实例:

我们现在有这样一个实体模型Word.cs:

public class Word

{

public int WordId { get; set; }

public string spell { get; set; }
public string type { get; set; }
public string speak { get; set; }
public string translate { get; set; }
public string sentence { get; set; }

}

这是EF codefirst中对应数据库实体模型的一个映射,现在用Repository模式来实现增删改查的需求。当然它要被EF数据库上下文调用:

 

public class EFcontext : DbContext

{
public EFcontext(): base("Test")//inherit the connectionstring from web.config
{

 

}

 

public DbSet<Word> Words { get; set; }

 

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

 

}

 

Repository最底层调用的公共代码,一个被用于继承的抽象类:EFRepositoryBase.cs

特别提一下,这里面的 where T:class 说明泛型T必须是引用类型(类、接口、委托或数组类型)

public abstract class EFRepositoryBase<T> :IRepository<T> where T:class

{
EFcontext EF = new EFcontext();

public EFRepositoryBase(EFcontext DataCotent)

{
EF = DataCotent;
}

public DbSet<T> Entities

{
get { return EF.Set<T>(); } //set as T
}

public List<T> GetAll()

{
return EF.Set<T>().ToList();
}

public T GetById(int Id)

{
return EF.Set<T>().Find(Id);
}

public int Add(T entity)

{
Entities.Add(entity);
return EF.SaveChanges();
}

public int Update(T entity)

{
EF.Entry(entity).State = EntityState.Modified;
return EF.SaveChanges();
}

public int Delete(int Id)

{
var entity = EF.Set<T>().Find(Id);
EF.Set<T>().Remove(entity);
return EF.SaveChanges();
}

public virtual IQueryable<T> Filter(Expression<Func<T, bool>> predicate)

{
return EF.Set<T>().Where<T>(predicate).AsQueryable<T>();
}
}

此类继承了一个接口类,用于通过接口来调用:

public interface IRepository<TEntity> where TEntity:class

{
List<TEntity> GetAll();

TEntity GetById(int Id);

int Add(TEntity entity);

int Update(TEntity entity);

int Delete(int Id);

IQueryable<TEntity> Filter(Expression<Func<TEntity, bool>> predicate);

}

接下来是实现Repository,通过一个类WordRepository .cs来继承此类:

public class WordRepository : EFRepositoryBase<Word>, IWordsRepository

{
private readonly EFcontext EF;

public WordRepository(EFcontext context) : base(context)

{
EF = context;
}

public List<Word> GetTenWords()

{
return EF.Words.OrderBy(t => Guid.NewGuid()).Take(10).ToList();
}

public void Dispose()

{
EF.Dispose();
}
}

这个类可以调用父类(EFRepositoryBase)定义的泛型公共方法,而泛型的类型这里是Word,其中GetTenWords方法是针对些特定的需求无法通过公共类继承来实现的就直接写在此类中来实现。当然也要在接口类中声明:

public interface IWordsRepository:IRepository<Word> //一定要继承IRepository接口,否则无法调用到EFRepositoryBase的方法接口

{
List<Word> GetTenWords();

}

此类调用方法如下:

IWordsRepository _WordRepository= new WordRepository(new EFcontext());

var result = _WordRepository.GetAll();

vat tenwords=_WordRepository.GetTenWords();

这里使用了接口来调用方法,其中GetAll()方法就是继承自EFRepositoryBase的方法,GetTenWords()是WordRepository类自己的方法

 

转载于:https://www.cnblogs.com/XCCU-2015/p/5089839.html

你可能感兴趣的文章
Java调用HTTPS接口的证书配置
查看>>
paxos算法之粗浅理解
查看>>
GCC编译器中的扩展
查看>>
windows系统下安装 node.js (node.js安装及环境配置)
查看>>
01d-1: 算法分析
查看>>
使用 Eclipse 插件部署 Java 应用
查看>>
切片操作:MATLAB VS Python
查看>>
SpringBoot--外部配置
查看>>
C#中的线程三 (结合ProgressBar学习Control.BeginInvoke)
查看>>
sqlserver工作日常使用sql--持续完善中
查看>>
文件I/O与标准I/O
查看>>
大数据学习之路(持续更新中...)
查看>>
项目开发总结报告(GB8567——88)
查看>>
enumerate使用
查看>>
神奇的位运算
查看>>
css 选择器优先级 pptx
查看>>
面试题总结101-)
查看>>
BZOJ1930: [Shoi2003]pacman 吃豆豆
查看>>
SSH加固
查看>>
端口扫描base
查看>>