3

目前,我正在使用 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; }
}
4

2 回答 2

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

于 2013-01-23T03:52:04.120 回答
1

如果要保持表不更改,则需要在两个 DBContexts 中将初始化程序设置为 null (如果它们具有表的子集)。

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

于 2013-01-23T03:50:22.077 回答