Asp.net mvc 如何在ASP.NET MVC应用程序中使用不同的实体框架DbContext?

Asp.net mvc 如何在ASP.NET MVC应用程序中使用不同的实体框架DbContext?,asp.net-mvc,entity-framework,asp.net-mvc-4,ef-code-first,asp.net-mvc-areas,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Ef Code First,Asp.net Mvc Areas,目前,我正在使用MVC4和实体框架代码构建一个web应用程序 在我的应用程序的主结构中,我有一个Dbcontext(BlogDB)来管理一些Blog类。它工作正常,因为它在数据库中创建了我需要的所有表。然后我创建了一个区域来托管一个在线商店。我的想法是创建一个单独的DbContext类(OnlineStoreDB)来处理仅用于在线商店的类 我的问题是,一旦启动了OnlineStoreDB,实体框架不仅为OnlineStore创建了表,而且还删除了旧表 我的问题是: 如果你知道保留旧桌子的方法 如

目前,我正在使用MVC4和实体框架代码构建一个web应用程序

在我的应用程序的主结构中,我有一个
Dbcontext(BlogDB)
来管理一些
Blog
类。它工作正常,因为它在数据库中创建了我需要的所有表。然后我创建了一个区域来托管一个在线商店。我的想法是创建一个单独的
DbContext
类(
OnlineStoreDB
)来处理仅用于在线商店的类

我的问题是,一旦启动了
OnlineStoreDB
,实体框架不仅为
OnlineStore
创建了表,而且还删除了旧表

我的问题是:

  • 如果你知道保留旧桌子的方法
  • 如何在一个应用程序中准确地管理多EF上下文类
  • 代码:

    public class BlogDB : DbContext
    {
        public BlogDB ()
            : base("DBConnection")
        {
            Database.SetInitializer(new BlogInitializer());
        }
    
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Author> Authors { get; set; }
        public DbSet<Comment> Comments { get; set; }
    }
    
    public class OnlineStoreDB : DbContext
    {
        public OnlineStoreDB() :
            base("DbConnection")
        {
            Database.SetInitializer(new OnlineStoreInitializer());
        }
    
        public DbSet<Order> Orders { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<User> Users { get; set; }
    }
    
    公共类BlogDB:DbContext
    {
    公共博客数据库()
    :base(“DBConnection”)
    {
    SetInitializer(新的BlogInitializer());
    }
    公共数据库集博客{get;set;}
    公共数据库集作者{get;set;}
    公共DbSet注释{get;set;}
    }
    公共类OnlineStoreDB:DbContext
    {
    公共OnlineStoreDB():
    基本(“数据库连接”)
    {
    SetInitializer(新的OnlineStoreInitializer());
    }
    公共数据库集命令{get;set;}
    公共数据库集产品{get;set;}
    公共数据库集用户{get;set;}
    }
    
    如果要保持表不更改,则需要在两个DBContext中都将initializer设置为null(如果它们都有表的子集)


    但我认为没有必要为一个数据库创建两个DBContext。您能清楚地将数据库中的两组表(域)分开吗?

    Xavier,欢迎先使用代码

    是的,代码优先是一种很好的方法,它承诺了很多。但现在你已经成功了。微软(或据我所知,微软以外的公司)没有一个聪明的头脑能够想出一种平滑的方法来智能地修改表,而不会危及数据和可能的模式

    2年前,实施策略是放弃并重建DB。这是无法忍受的,因为我们中的许多人没有SU访问权限,并且被挡在了我们的轨道上

    对于我从代码优先中发现的所有优点,我更喜欢DB优先。虽然数据不容易保存,但注释可以通过伙伴类进行保存

    微软提出了一些聪明的迁移策略。我强烈建议你读这两篇文章。代码项目2:

    (一)

    (二)

    无论您是否决定首先继续使用代码,它们都应该是有启发性的。我听起来像个批评家,但我在一个优点和另一个稳定性之间左右为难


    最后,我认为不应该保留2个DBContext。您的POCO应整合在1个上下文中。

    首先编码将是一项挑战。但你为什么要这样做呢?你不能在一个上下文中创建所有POCO吗?如果不是,我建议使用factory对象。祝你好运我也是一个老学究,更喜欢先设计数据库模式。谢谢Dave,我觉得先编写代码有时会让人头疼。我做了迁移,这就是为什么BlogDB的旧表不见了。您是对的,我只能通过从sql server中删除整个数据库并再次运行应用程序来解决问题。将首先切换到DB。祝你好运Xavier!我经历了完全相同的过程,结果糟透了。如果你还没有,请阅读好友课程。在POCOs上保留数据注释的聪明方法,尽管需要不断地重建。@DaveA您有一些使用buddy类的好例子吗?thanks@Xavier,这篇文章底部附近就是一个例子。你好,Jayantha,我在一个DBContext中整合了所有数据库集,从sql server中删除了数据库,重新运行了应用程序,它只能正常工作。但是,您知道在一个项目中处理两个DBContext的示例吗?