C# 实体框架 DBContext

7
我正在尝试学习Code First EF6,但是DBContext让我感到困惑。
我将要处理的数据库包含800多个表,而当我只处理应用程序的特定部分时,我只涉及1-10个表。
所以我的问题是:没有涉及800多个类的DBContext会对系统资源产生很大的负面影响吗?
我猜我对这项技术还是新手,对我在研究中获得的实际信息的意义感到困惑。
谢谢。
注意:感谢您的输入。请查看此帖子:Using multiple DbContexts with a generic repository and unit of work。它指出我不能在不同的上下文中拥有相互关联的表?!
但在现实世界的场景中,我理解的是,将表关系分解为专注的区域是很常见的,那么在Code First EF中如何实现呢?再次感谢。

只需使用 DB first 方法并导入所需的实体即可。 - Ric
1
你不想要一个拥有800多个表对象的模型。你可以拥有多个DbContext模型。你可以创建一个用于处理员工的模型,另一个用于处理课程或者其他项目涉及的领域。 - JamieD77
更新了我的回答。 - Masoud Andalibi
2个回答

5

更新

如果您正在使用存储库模式,您不能创建多个DbContext,您需要创建一个通用的DbContext,并像下面这样将其传递给通用存储库:

public class Repository<T> : IRepository<T>
    where T : EntityBase
{
    internal MyDbContext context;
    internal DbSet<T> dbSet; 

    public Repository()
    {
        context = new MyDbContext();
        this.dbSet = context.Set<T>(); 
    }
    public void Add(T entity)
    {
        dbSet.Add(entity);
    }
    public void Delete(T entity)
    {
        dbSet.Remove(entity);
    }
    public void Delete(int id)
    {
        dbSet.Remove(dbSet.Find(id));
    }
    public T GetById(int id)
    {
        return dbSet.Find(id);
    }
    public IEnumerable<T> GetAll()
    {
        return dbSet.AsEnumerable();
    }
    public void Update(T entity)
    {
        dbSet.Attach(entity);
        context.Entry(entity).State = EntityState.Modified;
    }
    public void Save()
    {
        context.SaveChanges(); 
    }
}

而且你也应该在那里包含你的 DbSets。


如果您正在进行EF Code-First,则需要根据所需数量设计您的POCO类,但不要超过所需数量。但根据您对800个表的说法,我认为您可能想尝试Database-First方法。我建议您非常仔细地阅读此article,因为它解释了您需要了解的一切。
更新:
如果您从DataBase-First的角度来看待这个问题:Ado.NET Entity Model会为您创建DbContext!如果您仔细查看.Edmx文件,它基本上就是您的POCO类。
现在,如果您尝试Code-First方法,假设您有这个DbContext类:
public class MyDbContext : DbContext
{
    public MyDbContext()
        : base("name=MyConnection")
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, YourApplication.Migrations.Configuration>("MyConnection")); 
    }
    //Every time you need to add new Table you add them here.
    public DbSet<Users> Users { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //And Map them here
        modelBuilder.Configurations.Add(new UsersMap());
    }
}

您只需按照以下方式向您的DbContext添加一个新的DbSet<Class>即可:
    public DbSet<POCO CLASS> CLASS { get; set; }

通常情况下,我会为MVC应用程序中的每个区域创建一个DbContext。因此,您可以像这样进行操作:管理区域 -> AdminDbContext等等。


我觉得困惑的是:我们有一个容器应用程序,在其中有许多组件(客户/员工记录、课程、业务日历、高尔夫球场等等),那么从这个角度来开发应用程序,我该如何做呢?也就是说,随着需求的增长,我们是否应该不断地向DBContext添加新的类?谢谢。 - Guygar
@Guygar 让我给你一个例子。请过几分钟再回来查看。 - Masoud Andalibi

4
你只需要在数据库上下文中使用你正在处理的表格(如果数据库已经存在)。唯一需要一个包含所有表格的数据库上下文的原因是想要从头开始重新创建整个数据库。
可以查看领域驱动设计中的有界上下文模式: http://martinfowler.com/bliki/BoundedContext.html

很棒的链接!专注于我问题的核心。您能否指导我在Code-First Entity Framework环境中如何实现它?谢谢。 - Guygar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接