【问题标题】:How to use different Entity Framework DbContext in the Area of ASP.NET MVC application?如何在 ASP.NET MVC 应用程序区域中使用不同的实体框架 DbContext?
【发布时间】:2013-01-06 11:33:56
【问题描述】:

目前我正在使用 MVC 4 和实体框架代码优先方案构建一个 Web 应用程序。

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

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

我的问题是:

  1. 如果您知道保留旧表的方法吗?
  2. 究竟如何在一个应用程序中管理多个 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; }
}

【问题讨论】:

  • Code-First 将是一个挑战。但是为什么你需要上下文?您不能在一个 contxt 中创建所有 POCO 吗?如果没有,我会推荐一个工厂对象。祝你好运!

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


【解决方案1】:

Xavier,欢迎使用代码优先!

是的,代码优先是一种出色的方法,它承诺了很多。但现在你已经成功了。在微软(或据我所知,在外部)没有聪明的人想出一种在不危及数据和可能的架构的情况下智能地更改表的流畅方法。

2 年前,实施策略是删除并重新构建数据库。这是无法容忍的,因为我们中的许多人都没有 SU 访问权限并且被拦在了我们的轨道上。

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

Microsoft 提出了一些巧妙的迁移策略。我强烈建议你阅读这两篇文章。代码项目二:

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 个上下文中合并。

【讨论】:

  • 我也是老派,更喜欢先设计我的数据库架构。
  • 感谢 Dave,我认为代码优先有时只是令人头疼。我进行了迁移,这就是为什么 BlogDB 的旧表消失了。你是对的,我只能通过从sql server中删除整个数据库并再次运行应用程序来解决问题。将首先切换到 DB。
  • 祝泽维尔好运!我经历了完全相同的过程,结果很糟糕。如果您还没有,请阅读伙伴课程。在不断重建的情况下保留 POCO 上的数据注释的巧妙方法。
  • @DaveA 你有一些很好的使用伙伴课程的例子吗?谢谢
  • @Xavier,本文底部附近是一个示例。 jameschambers.com/2011/08/…
【解决方案2】:

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

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

【讨论】:

  • 嗨 Jayantha,我在一个 DBContext 中合并了所有 DBSet,从 sql server 中删除了数据库,重新运行应用程序,它只能正常工作。但是,您知道在一个项目中处理两个 DBContext 的示例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多