如何使用内部DbContext?

时间:2015-02-25 20:41:38

标签: c# entity-framework-6

如何使用内部DbContext? 我想知道如何隐藏DbContext对象,以便我的项目的其他库不能直接访问。

我将DbContext作为库中的内部,显然应该可以工作,但是当我运行应用程序时,会出现以下错误:

目标上下文“上下文”不可构造。添加默认构造函数或提供IDbContextFactory的实现

有人可以帮助我吗?

我的数据层实现是:

[DbConfigurationType(typeof (ConfigContext))]
internal class Context : DbContext
{
    internal Context()
        : base(ConfigDataBase.GetSqlServerString(ConfigZnfce.Instance.SqlServerInstance))
    {
    }
    //More code below
}


public class ConfigContext: DbConfiguration
{
    public ConfigContext()
    {
        SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.LocalDbConnectionFactory("v11.0"));
        SetProviderServices("System.Data.SqlClient", System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        SetDatabaseInitializer(new CreateDatabaseIfNotExists<Context>());
        SetDatabaseInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());            
    }
}

我希望所有其他库都需要通过一个工作单元和存储库才能对数据库进行任何操作

[解决]

我作为内部上下文和构造函数上下文和public一起离开,如下面的代码所示:

[DbConfigurationType(typeof (ConfigContext))]
internal class Context : DbContext
{
    public Context()
        : base(ConfigDataBase.GetSqlServerString(ConfigZnfce.Instance.SqlServerInstance))
    {
    }
    //More code below
}

1 个答案:

答案 0 :(得分:2)

DbContext类上的虚拟DBSet&lt;&gt; 属性必须是公开的(正如您在解决方案中找到的那样。

如果您正在使用TT模板,则可以通过更改 DbSet(EntitySet entitySet)功能来实现此目的。请注意,术语 public 会替换字符串格式中的原始 {0} 参数。

public string DbSet(EntitySet entitySet) {
    return string.Format(
        CultureInfo.InvariantCulture,
        "public virtual DbSet<{0}> {1} {{ get; set; }}",
        _typeMapper.GetTypeName(entitySet.ElementType),
        _code.Escape(entitySet));
}

现在,您可以拥有内部DbContext,内部对象,并且仍然具有公共自动属性,因此EF可以进行数据绑定。