普通的使用方法是直接在DbContext,将models中用到的那些类的的DbSet添加进去作为property,如:
public class MyDbContext:DbContext
{
public dbContext()
: base("name=CmsConn")
{ }
public DbSet<Admin> Admins { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<Limit> Limits { get; set; }
public DbSet<News> Newses { get; set; }
public DbSet<NewsImg> NewsImgs { get; set; }
............
//这里省去50个DbSet<Entity>
}
我这里的疑问是:
如果每次在Controller中,使用这个MyDbContext,
服务器内存中是不是就相当于把整个数据库都搬过来了,
虽然编程会很方便,但我觉得资源浪费的太严重了
有没有动态添加DbSet的方式或架构,求相关资料,网上搜到的都太基础了
直接贴代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Data.Entity; 6 using System.ComponentModel.DataAnnotations; 7 using System.Data.Entity.ModelConfiguration; 8 using System.Data.Entity.ModelConfiguration.Configuration; 9 10 namespace CodeFirstDemo 11 { 12 /// <summary> 13 /// 实体注册Helper接口 14 /// </summary> 15 public interface IEntityRegstHelper 16 { 17 void RegTo(ConfigurationRegistrar confRegistrar); 18 } 19 20 // 客户 21 public class Customer 22 { 23 public int CustomerID { get; set; } 24 public String CustomerName { get; set; } 25 public string Address { get; set; } 26 } 27 // 客户实体的注册Helper 28 public class CustomerRegstHelper : IEntityRegstHelper 29 { 30 public void RegTo(ConfigurationRegistrar confRegistrar) 31 { 32 confRegistrar.Add<Customer>(new EntityTypeConfiguration<Customer>()); 33 } 34 } 35 36 37 public class MyDbContext : DbContext 38 { 39 List<IEntityRegstHelper> entityRegstHelperlist; 40 // 添加实体注册 41 public void AddEntityRegHelper(IEntityRegstHelper r) 42 { 43 if (entityRegstHelperlist == null) 44 entityRegstHelperlist = new List<IEntityRegstHelper>(); 45 entityRegstHelperlist.Add(r); 46 } 47 48 //public DbSet<Customer> Customers { get; set; } 49 protected override void OnModelCreating(DbModelBuilder modelBuilder) 50 { 51 // 动态地加入实体 52 if (entityRegstHelperlist != null) 53 { 54 foreach (IEntityRegstHelper r in entityRegstHelperlist) 55 r.RegTo(modelBuilder.Configurations); 56 } 57 } 58 } 59 60 class Program 61 { 62 static void Main(string[] args) 63 { 64 using (var db = new MyDbContext()) 65 { 66 db.AddEntityRegHelper(new CustomerRegstHelper()); 67 68 var c = new Customer() 69 { 70 CustomerName = "长沙市大风通讯有限公司", 71 Address = "长沙市" 72 }; 73 db.Set<Customer>().Add(c); 74 db.SaveChanges(); 75 76 var query = from customer in db.Set<Customer>() 77 select customer; 78 foreach (var cq in query) 79 { 80 Console.WriteLine("客户: {0}, 地址:{1}", cq.CustomerName, cq.Address); 81 } 82 83 Console.WriteLine("按任意键退出"); 84 Console.ReadKey(); 85 } 86 } 87 } 88 }
谢谢!代码简明清晰。
下次试试这个方法。
我在园子里查到了郭明峰的一套框架,人家做的是企业级的,我从中抽取了我的小型项目需要用到的一部分.
不会全部搬过来的,不是说一个public DbSet<Role> Roles { get; set; }就搬一个表的数据过来
要是这框架连这都没考虑到,那就不值得使用了~
你这种回复毫无意义,EF框架肯定是由动态注册的方式,不过外面流传的资料大多数都是最简单的方法,直接向DbContext里加入固定的DbSet,这种方式不要说企业级开发,连小型开发的需求都满足不了。
你这种回复浪费自己时间,浪费别人时间
@chutianshu_1981: 抱歉,浪费你时间了,请直接忽略。
可以 不声明对应的 DbSet属性,但是 要 先注册配置,modelBuilder.Configurations.Add(new RolesConfiguration())
后面就可以 动态DbSet了。
我觉得modelBuilder.Configurations.Add(new RolesConfiguration())并不是用来将DbSet动态注册到DbContext中的,
这个方法的作用是添加Model中的类到数据库表映射关系
@chutianshu_1981:
没有说 把 DbSet动态注册啊, 只是说 添加配置映射后, 就可以动态 用Dbset来获取了,不用声明 DbSet对应的属性了。
哪怕只有一个DbSet,都不应该把“整个数据库都搬过来”
请问EF框架中内存自动加载DbSet的原理,有没有相应资料
我找了几天没找到合适的,求助
@chutianshu_1981:
我也没找到这方面的资料,可以直接看Entity Framework的源代码