如何在ASP.NET MVC应用程序区域中使用不同的Entity Framework DbContext?

时间:2013-01-23 03:42:00

标签: asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first asp.net-mvc-areas

目前我正在使用MVC 4和实体框架代码构建第一个场景的Web应用程序。

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

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

我的问题是:

  1. 如果你知道保留旧桌子的方法吗?
  2. 如何在一个应用程序中管理多个EF上下文类?
  3. 代码:

    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; }
    }
    

2 个答案:

答案 0 :(得分:3)

Xavier,欢迎代码优先!

是的,代码优先是一种非常出色的方法。但是现在你已经赶上了。微软(或据我所知,除此之外)没有聪明的想法,他提出了一种平滑的方式来智能地改变表,而不会危及数据和可能的架构。

2年前,实施策略是放弃并重新构建数据库。这是无法忍受的,因为我们中的许多人没有SU访问权限,而且已经停止了。

为了我从代码中找到的所有优点,我首选DB。虽然数据无法轻易保存,但注释可以通过好友类进行。

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

1)http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

2)http://www.codeproject.com/Articles/504720/EntityplusFrameworkplusCodeplusFirstplusMigrations

您是否决定继续使用Code-First,他们应该具有启发性。我听起来像一个评论家,但我在一个人的优势和另一个人的稳定性之间徘徊。

最后,我认为你不应该保留2个dbcontexts。您的POCO应该在一个上下文中合并。

答案 1 :(得分:1)

如果你想保持表没有改变,你需要在两个DBContexts中将初始化器设置为null,如果它们有子表集。

但是我没有看到你为一个数据库创建两个DBContexts的观点。你能清楚地将数据库中的两组表(域)分开吗?