C# 实体框架 DBContext

Posted

技术标签:

【中文标题】C# 实体框架 DBContext【英文标题】:C# Entity Framework DBContext 【发布时间】:2017-05-14 20:39:51 【问题描述】:

我正在尝试学习 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 方法并导入所需的实体。 您不希望一个模型包含 800 多个表格对象。您可以有多个 dbcontext 模型。您可以创建一个模型来处理员工,另一个模型用于处理课程或您的项目涉及的任何其他领域 更新了我的答案 【参考方案1】:

更新

如果您使用存储库模式,则不能创建多个 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(); 
    

您也应该在其中包含您的 DbSet。


如果您正在执行 EF Code-First,那么您可以根据需要的数量来设计 POCO 类,但仅此而已。但根据您对800 表的看法,我认为您可能更想尝试Database-First 方法。我建议你这个article 非常仔细,因为它解释了你需要的一切。

更新:

如果您从数据库优先处理此问题:Ado.NET Entity Model 为您创建 DbContext!如果您仔细查看 .Edmx 文件,它基本上就是您的 POCO 类。

现在,如果您尝试代码优先方法,假设您有这个 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());
    

您只需将新的DbSet&lt;Class&gt; 添加到您的DbContext,如下所示:

    public DbSet<POCO CLASS> CLASS  get; set; 

等等,我通常为我在 MVC 应用程序中的每个 Area 创建一个 DbContext。所以你可以像Admin Area -> AdminDbContext 等等。

【讨论】:

我发现令人困惑的是;我们有一个容器应用程序,其中有许多组件(客户/员工记录、课程、商务日历、高尔夫......),所以我如何从这个角度开发应用程序,即我们是否不断向 DBContext 添加新类随着我们需求的增长?谢谢。 @Guygar 让我给你举个例子。过几分钟再回来看看【参考方案2】:

您只需要在 db 上下文中使用的表(如果 db 已经存在)。您需要包含所有表的数据库上下文的唯一原因是您想从头开始重新创建整个数据库。

看看来自 DDD 的有界上下文模式:http://martinfowler.com/bliki/BoundedContext.html

【讨论】:

很好的链接!专注于我的问题的全部内容。您能否指出关于它在 Code-First Entity Framework 环境中实现的正确方向?谢谢。 msdn.microsoft.com/en-us/magazine/…

以上是关于C# 实体框架 DBContext的主要内容,如果未能解决你的问题,请参考以下文章

插入束数据 - 实体框架 C#

C#:更改实体框架的检索数据类型

C# 实体框架每个 HttpContext 仅使用一个 ObjectContext

C# 实体框架 - 优化/最佳实践

C# 实体框架向来自外部库的实体添加新列

我的 C# 实体框架项目出没了吗?