禁用Database-First工作流上的默认构造函数

时间:2014-07-28 09:46:43

标签: entity-framework entity-framework-5 ef-model-first

如何防止使用生成的DbContext的无参数构造函数?

var dcx = new DataEntities();

默认构造函数由T4模板生成,因此我无法在分部类中覆盖它。我希望它不能编译,但运行时错误也会很好。

3 个答案:

答案 0 :(得分:12)

您可以修改模板以提供所需的构造函数。

  • 打开*.Context.tt文件
  • 转到第59行
  • 更改此代码。

    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    
  • 例如,进入您想要的默认构造函数。

    public <#=code.Escape(container)#>(string nameOrConnectionString)
        : base(nameOrConnectionString)
    
  • 保存

答案 1 :(得分:2)

您可以继承模板创建的DbContext,定义自己的构造函数,并使用继承的DbContext而不是模板生成的{。}}。

public class MyModifiedDbContext : TheTemplateGeneratedDbContext
{
   public MyModifiedDbContext() 
   {
       // define your own constructor
   }
}

或者将其设为私有以避免使用它,因此您在编译时得到错误

public class MyModifiedDbContext : TheTemplateGeneratedDbContext
{
   private MyModifiedDbContext() 
   // ...
}

使用MyModifiedDbContext代替TheTemplateGeneratedDbContext

答案 2 :(得分:1)

我放弃了等待 EF Core 团队将其添加为一个选项。我不想为此制作和维护自己的 T4 模板 - 这太疯狂了!

我的解决方案只是在生成的代码上运行一些正则表达式作为 powershell 脚本的一部分。

fix-dbcontext.ps1

$filename=$args[0]

# load context file
$content = (Get-Content -Raw $filename) 

[regex] $commentOutConstructorRegex = '(?ms)(?<=: DbContext\s*.*?)(public.*?)(?=\s*public)'
$content = $commentOutConstructorRegex.Replace($content, '// Default constructor removed', 1)

[regex] $removeOnConfiguringRegex = '(?ms)(protected override void OnConfiguring).*?(?=\s*protected)'
$content = $removeOnConfiguringRegex.Replace($content, '// Generated OnConfiguring removed', 1)

[regex] $dateCommentRegex = '(?ms)(?=\s*public partial class)'
$content = $dateCommentRegex.Replace($content, "`r`n`t// Generated " + (Get-Date).ToString() + "`r`n", 1)

$content | Out-File -Encoding UTF8 $filename

这将:

  1. 删除默认构造函数
  2. 删除包含硬编码连接字符串的 OnConfiguring 方法
  3. 在评论中添加日期

只需使用 .\fix-dbcontext.ps1 .\MyDBContext.cs 运行它。

您可能希望将最后一行更改为 context.txt 而不是 $filename,直到您确定它符合您的要求。

重要提示:这仅在 EFCore 模板上进行了测试,但如果您了解我的正则表达式,您应该能够针对 EntityFramework 对其进行修改(如果它不起作用)。