如何防止使用生成的DbContext的无参数构造函数?
var dcx = new DataEntities();
默认构造函数由T4模板生成,因此我无法在分部类中覆盖它。我希望它不能编译,但运行时错误也会很好。
答案 0 :(得分:12)
您可以修改模板以提供所需的构造函数。
*.Context.tt
文件更改此代码。
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 脚本的一部分。
$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
这将:
OnConfiguring
方法只需使用 .\fix-dbcontext.ps1 .\MyDBContext.cs
运行它。
您可能希望将最后一行更改为 context.txt
而不是 $filename
,直到您确定它符合您的要求。
重要提示:这仅在 EFCore 模板上进行了测试,但如果您了解我的正则表达式,您应该能够针对 EntityFramework 对其进行修改(如果它不起作用)。