首页 新闻 会员 周边 捐助

CodeFirst中DbContext能够动态添加DbSet么?

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-10 10:49

普通的使用方法是直接在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的方式或架构,求相关资料,网上搜到的都太基础了
问题补充:

哪位能把EF 的DbContext运作原理解释一下,谢了

chutianshu_1981的主页 chutianshu_1981 | 初学一级 | 园豆:43
提问于:2013-08-20 12:06
< >
分享
最佳答案
2

直接贴代码:

 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 }
收获园豆:20
tanxiancheng | 菜鸟二级 |园豆:224 | 2013-10-04 20:59

谢谢!代码简明清晰。
下次试试这个方法。

我在园子里查到了郭明峰的一套框架,人家做的是企业级的,我从中抽取了我的小型项目需要用到的一部分.

chutianshu_1981 | 园豆:43 (初学一级) | 2013-10-10 11:03
其他回答(4)
0

不会全部搬过来的,不是说一个public DbSet<Role> Roles { get; set; }就搬一个表的数据过来

Yu | 园豆:12990 (专家六级) | 2013-08-20 12:45
0

要是这框架连这都没考虑到,那就不值得使用了~

幻天芒 | 园豆:37205 (高人七级) | 2013-08-20 13:12

你这种回复毫无意义,EF框架肯定是由动态注册的方式,不过外面流传的资料大多数都是最简单的方法,直接向DbContext里加入固定的DbSet,这种方式不要说企业级开发,连小型开发的需求都满足不了。

你这种回复浪费自己时间,浪费别人时间

支持(0) 反对(0) chutianshu_1981 | 园豆:43 (初学一级) | 2013-10-10 11:07

@chutianshu_1981: 抱歉,浪费你时间了,请直接忽略。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-10-10 12:55
1

可以 不声明对应的 DbSet属性,但是 要 先注册配置,modelBuilder.Configurations.Add(new RolesConfiguration())

后面就可以 动态DbSet了。

Qlin | 园豆:2403 (老鸟四级) | 2013-08-20 13:36

我觉得modelBuilder.Configurations.Add(new RolesConfiguration())并不是用来将DbSet动态注册到DbContext中的,

这个方法的作用是添加Model中的类到数据库表映射关系

支持(0) 反对(0) chutianshu_1981 | 园豆:43 (初学一级) | 2013-08-21 11:02

@chutianshu_1981: 

没有说 把 DbSet动态注册啊, 只是说 添加配置映射后, 就可以动态 用Dbset来获取了,不用声明 DbSet对应的属性了。

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2013-08-21 14:09
0

哪怕只有一个DbSet,都不应该把“整个数据库都搬过来”

dudu | 园豆:30925 (高人七级) | 2013-08-20 15:04

请问EF框架中内存自动加载DbSet的原理,有没有相应资料

 

我找了几天没找到合适的,求助

支持(0) 反对(0) chutianshu_1981 | 园豆:43 (初学一级) | 2013-08-21 11:04

@chutianshu_1981: 

我也没找到这方面的资料,可以直接看Entity Framework的源代码

支持(0) 反对(0) dudu | 园豆:30925 (高人七级) | 2013-08-21 11:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册