C# 如何使用内部DbContext?

C# 如何使用内部DbContext?,c#,entity-framework-6,C#,Entity Framework 6,如何使用内部DbContext? 我想知道如何隐藏DbContext对象,以便我的项目的其他库不能直接访问 我将DbContext放在库中作为内部,显然应该可以工作,但是当我运行应用程序时,出现以下错误: 目标上下文“context”不可构造。添加默认构造函数或提供IDbContextFactory的实现 有人能帮我吗 我对数据层的实现是: [DbConfigurationType(typeof (ConfigContext))] internal class Context : DbConte

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

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

目标上下文“context”不可构造。添加默认构造函数或提供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>());            
    }
}
DbContext类上的虚拟DBSet属性必须是公共的(正如您在解决方案中发现的那样)

如果您正在使用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));
}
公共字符串数据库集(EntitySet EntitySet){
返回字符串格式(
CultureInfo.InvariantCulture,
“公共虚拟数据库集{1}{{get;set;}}}”,
_typeMapper.GetTypeName(entitySet.ElementType),
_代码.转义(entitySet));
}

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

您是如何实现DbContext的?我可以问一下,为什么要隐藏DbContext吗?您可以将其包装到一个存储库模式中,其他类可以访问该模式,但我仍然不会将其集成rnal。我编辑了消息并包含了我的上下文的实现。我不想要公共上下文,因为我不想让其他库直接访问它,因为我想完全封装数据层。我不想让没有访问数据层源代码的其他开发人员可以直接使用上下文保存实体。S变化()…这不会阻止其他开发人员引用该库,并会在其项目中添加对assembly EntityFramework的引用。这样,他就可以完全访问Context@danludwig这倒是对的,但作为一个类比,上锁的门并不能阻止人们进入你的房子,然而,它们确实提供了一个漂亮的环境很好,你不想让他们进去。
public string DbSet(EntitySet entitySet) {
    return string.Format(
        CultureInfo.InvariantCulture,
        "public virtual DbSet<{0}> {1} {{ get; set; }}",
        _typeMapper.GetTypeName(entitySet.ElementType),
        _code.Escape(entitySet));
}