1

我对 EF 迁移如何处理我的存储库是通用的( IRepository<>)并由我选择的依赖注入工具在运行时注入的场景感到困惑。您知道数据库是由迁移使用三个元素更新/同步的:

  1. 数据库模型(对象上下文和 DbSet<> 属性)
  2. 迁移文件夹中的迁移类
  3. 已经存在的数据库(如果有的话)

您可以看到一个基本元素是对象上下文及其属性。如果您在没有 dbset 属性的情况下公开 Object 上下文,则 Migrations 使用的过程不会以正确的方式执行。

我有以下项目的解决方案:Core.Entities、Core.RepositoryInterfaces 和 Infraestructure.RepositoryEF、Infraestructure.DependencyResolution 和 UI.WebSite。

如您所知,当我需要存储库时,它们会被注入到类构造函数中:

  private IRepository<Product> _productrepo;  
  Public Test(IRepository<Product> productRepo)
  {
            _productRepo = productrepo;
   }

问题是:由于我的对象上下文没有 dbset<> 属性(我的依赖工具在运行时注入这些存储库),迁移如何更新数据库?

感谢您的宝贵帮助。

4

1 回答 1

1

如果您有一个空的 dbcontext 对象(我的意思是没有 dbset 属性),我认为代码优先迁移不会更新您的模型。因此,在您使用存储库模式并将 dbcontext 对象注入每个请求的存储库的情况下,处理这种情况的一种方法是:

设计两个 dbcontext 对象,一个用于开发时(devdbcontext),另一个用于生产环境(proddbcontext)。

  1. devdbcontext将设计有 dbset 属性,这样迁移工作流在开发时将是正常的;它将检测模型更改并重新创建数据库等。当您处于调试模式时将选择此对象(#if DEBUG)

  2. Proddbcontext将是一个没有 dbset 属性的派生 dbcontext 对象,当您处于 RELEASE 模式 (#if RELEASE) 时将被选中。为了更新生产数据库,我将生成一个 DATABASE SCRIPT 并将数据库初始化程序设置为 NULL。

你觉得这个解决方案怎么样?

于 2013-06-24T13:14:08.290 回答