公司的项目在用EF,最近抽时间研究了下,整理了一个比较公用的EF框架,供大家一起分享下。

EF这东东,用得好的话,确实方便了开发;用得不好的话,出了问题半天也找不出是什么原因。

现在就先介绍EF的简单使用。主要分为以下5个项目

EF.Core:数据实体

EF.Data:C#实体跟数据表直接的映射

EF.Service:数据服务

EFFramework:公共类库

EFSolution:测试项目

DbContext是EF比较重要的类,我们的数据库访问对象都必须继承该类。下面就是我们要用到的数据上下文:

public class EFObjectContext : DbContext, IDbContext
    {
        public EFObjectContext(string nameOrConnectionString)
            : base(nameOrConnectionString)
        {
            //((IObjectContextAdapter) this).ObjectContext.ContextOptions.LazyLoadingEnabled = true;
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //dynamically load all configuration
            //System.Type configType = typeof(LanguageMap);   //any of your configuration classes here
            //var typesToRegister = Assembly.GetAssembly(configType).GetTypes()

            string[] MapPath = { "EF.Data.dll" };

            foreach (var path in MapPath)
            {
                var asm = Assembly.LoadFrom(path);
                var typesToRegister = asm.GetTypes()
                .Where(type => !String.IsNullOrEmpty(type.Namespace))
                .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

                foreach (var type in typesToRegister)
                {
                    dynamic configurationInstance = Activator.CreateInstance(type);
                    modelBuilder.Configurations.Add(configurationInstance);
                }
            }

            //...or do it manually below. For example,
            //modelBuilder.Configurations.Add(new LanguageMap());

            base.OnModelCreating(modelBuilder);
        }
}
View Code

OnModelCreating方法是应用程序在初始化时将实体跟数据表的映射加载到数据上下文。

1、定义实体

    public class BlogUser:BaseEntity
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
    }
View Code

此处比较简单,不再废话。

2、定义映射

public partial class BlogUserMap : EntityTypeConfiguration<BlogUser>
    {
        public BlogUserMap()
        {
            this.ToTable("BlogUser");
            this.HasKey(c => c.Id);
        }
    }
View Code

定义实体跟数据表的映射,实体之间一对一、一对多、多对多的关系也在此处定义。

3、定义数据服务

public interface IBlogUserService
    {
        IList<BlogUser> GetAllBlogUser();
    }
View Code
public class BlogUserService : IBlogUserService
    {
        private readonly IRepository<BlogUser> _blogUserRepository;
        public BlogUserService(IRepository<BlogUser> blogUserRepository)
        {
            this._blogUserRepository = blogUserRepository;
        }
        public IList<BlogUser> GetAllBlogUser()
        {
            return _blogUserRepository.Table.ToList();
        }
    }
View Code

测试程序如下:

static void Main(string[] args)
        {
            EngineContext.Initialize(false);
            Console.WriteLine("初始化完成");

            IBlogUserService service = EngineContext.Current.Resolve<IBlogUserService>();

            IList<BlogUser> users = service.GetAllBlogUser();

            Console.ReadKey();
        }
View Code

这就是EF的简单使用。

源代码下载地址:http://pan.baidu.com/s/1mgJ57Ck

posted on 2015-08-18 20:32  大波哥  阅读(1130)  评论(18编辑  收藏  举报