数据库第一个实体框架核心的自定义脚手架逻辑

时间:2019-05-09 17:29:50

标签: c# asp.net-core entity-framework-core

我是Entity Framework Core的新手,因为我目前正在从EF6迁移过来。我们使用数据库优先模型。

我创建了一个.Net Standard类库,在其中导入了EF Core,并在VS中使用了scaffolding命令来导入我的一张表作为测试-可以正常工作。

我们有几个不同的副本数据库,这些副本数据库用于地理冗余和报告目的,但是都具有相同的模型。

我设置了不同的连接选项,有点类似于本文Using Entity Framework Core migrations for class library project的答案中的第2点,因此我们可以支持到不同数据库的连接。

现在,我想添加其余的表。我已经看到了关于Migrations的提及,但这似乎是针对代码优先模型的。

然后,我尝试在脚手架上使用“ -Force”命令,该命令确实导入了另一个表,但是我失去了对多数据库的支持。

在EF6中,我在Context.tt文件中拥有此逻辑,因此当我从数据库中检索更新时,它将保留我拥有的自定义连接选项。

是否有办法在EF Core中复制此文件或缺少什么?

同样,对于像表上的新列这样简单的事情,我还应该运行相同的命令吗?

预先感谢

大卫

*更新*

我最终使用了EF Core Power Tools,它是一个很棒的软件包,可以完全控制模型,就像以前的context.tt文件一样。

对于未来的任何人,我都对EF Core Power Tools中的Handlebars模板进行了反向工程和使用。我传递了在应用程序启动时使用的3个连接字符串,然后可以设置可选的布尔值来指示要使用的连接-对于重新开始的人来说,枚举可能更优雅,但这使我们更容易迁移。 在DbConstructor.hbs中,我将其更新为:

{{spaces 8}}public {{class}}(bool ReadOnlyDatabase = false, bool ReportsDatabase = false) : base()
{{spaces 8}}{ 
            if (ReadOnlyDatabase)
                _connectionString = ReadOnlyContext;
            else if (ReportsDatabase)
                _connectionString = ReportsContext;
            else
                _connectionString = ReadWriteContext;
{{spaces 7}} }

DbContext.hbs文件为:

{{> dbimports}}

namespace {{namespace}}
{
    public partial class {{class}} : DbContext
    {
        public static string ReadWriteContext = "";
        public static string ReadOnlyContext = "";
        public static string ReportsContext = "";

        private readonly string _connectionString;
{{{> dbsets}}}
{{#if entity-type-errors}}
{{#each entity-type-errors}}
{{spaces 8}}{{{entity-type-error}}}
{{/each}}

{{/if}}

{{{> dbconstructor}}}

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(_connectionString);
        }
{{{on-model-creating}}}
    }
}

2 个答案:

答案 0 :(得分:1)

为构造函数提供一个DbContextOptions:

guard let arrayPhoto = jsonRaw as? [Photo] else ..

也许EF核心电动工具可以为您提供帮助? (我是作者)

答案 1 :(得分:1)

您需要发布更多代码,以便我们了解发生了什么。听起来好像您正在自定义生成的上下文类。您将在每次使用脚手架的操作中将其覆盖,并且如您所述,迁移支持可用于通过模型更改来驱动db Schema更新。即首先是代码。

db的第一个脚手架方法似乎是在编写该脚手架的期望下进行的,其后模型和上下文将被手动更新。 我们有一个工作流程,其中涉及重新搭建DbContext以响应数据库架构更新,因此需要做三件事:

  • 设置本地主机或SSPI数据库的脚手架,以便嵌入式连接字符串不包含任何值密码。
  • 容忍CI / CD中有关脚手架每次无法禁用时生成的连接字符串的恼人警告。
  • 我们在必要时使用扩展方法向DbContext添加功能,因此我们无需更改生成的代码。

现在,我不建议使用扩展方法来初始化不同的连接字符串。

我确定那些人肯定已经来自config了,如果不是,那是您在制作一个控制台而不是asp.net核心应用程序,它使配置驱动的DbContexts的创建变得非常容易,我真的建议学习至少使用Microsoft。 Extensions.Configuration,可通过appSettings配置DbContext实例。

我不能直接使用DbOptionsBuilder分享初始化DBContext的代码示例,因为我的罪魁祸首是我总是在Asp.net Core中获得DI来为我做。