覆盖代码生成的DbContext构造函数

Chr*_*xon 11 .net c# asp.net-mvc entity-framework connection-string

我确定我在某个阶段之前已经完成了这个,但我现在还不清楚怎么做!我的情景:

// This is generated from EDMX
public partial class HOLDbEntities : DbContext
{
    public HOLDbEntities()
            : base("name=HOLDbEntities")
        {
        }
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望这个连接字符串很容易更改(我想从HOLDbEntities实现),所以我需要覆盖这个构造函数.

我试过了:

public partial class HOLDbEntities
{
    private const string _contextName = "HOLDbEntities";
    public static string ContextName { get { return _contextName; } }

    public HOLDbEntities()
        : base(ContextName)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会引发一个错误:

HOLDbEntities已经定义了一个名为"HOLDbEntities"的成员,它具有相同的参数类型.

我可以理解为什么会出现这种错误,但是为了做我想要实现的目标,我将如何阻止构造函数首先自动生成?

Dyl*_*yes 19

我对之前接受的答案进行了投票,因为这是一种相当优雅的方式.然而,另一种方法是修改生成dbContext类的T4模板.

首先使用EF DB时,你有一个.edmx文件,然后你有一个[Entity] .Context.tt文件.进入该文件并删除(或修改)以下代码:

public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}

foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>())
{
    // Note: the DbSet members are defined below such that the getter and
    // setter always have the same accessibility as the DbSet definition
    if (Accessibility.ForReadOnlyProperty(entitySet) != "public")
    {
#>
        <#=codeStringGenerator.DbSetInitializer(entitySet)#>
<#
    }
}
#>
Run Code Online (Sandbox Code Playgroud)

现在你的上下文类将在没有构造函数的情况下生成,所以你应该能够在扩展类中创建一个.


Mar*_*ell 8

我能建议的最好的是工厂方法:

private HOLDbEntities(string contextName) : base(contextName) { }

public static HOLDbEntities Create() {
    return new HOLDbEntities(ContextName);
}
Run Code Online (Sandbox Code Playgroud)

并使用HOLDbEntities.Create()而不是new HOLDbEntities().