Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我无法访问App.config时,如何使用EF6和SQL Server CE数据库?_C#_Entity Framework_Configuration_Entity Framework 6_Sql Server Ce 4 - Fatal编程技术网

C# 当我无法访问App.config时,如何使用EF6和SQL Server CE数据库?

C# 当我无法访问App.config时,如何使用EF6和SQL Server CE数据库?,c#,entity-framework,configuration,entity-framework-6,sql-server-ce-4,C#,Entity Framework,Configuration,Entity Framework 6,Sql Server Ce 4,我对Entity Framework 6和SQL Server CE 4.0的基于代码的配置有问题。我的项目是一个COM组件类库,必须与多个应用程序一起工作,我无法提前知道哪些应用程序将使用该组件,因此我不能使用app.config作为配置机制 我尝试使用基于代码的配置,如下所示。首先,我的上下文类: [DbConfigurationType(typeof(DataConfiguration))] internal class SlewTargetsDbContext : DbContext {

我对Entity Framework 6和SQL Server CE 4.0的基于代码的配置有问题。我的项目是一个COM组件类库,必须与多个应用程序一起工作,我无法提前知道哪些应用程序将使用该组件,因此我不能使用
app.config
作为配置机制

我尝试使用基于代码的配置,如下所示。首先,我的上下文类:

[DbConfigurationType(typeof(DataConfiguration))]
internal class SlewTargetsDbContext : DbContext
{
    public SlewTargetsDbContext(string connectionString):base(connectionString){  }

    public DbSet<SlewTarget> Targets { get; set; }

    #region Overrides of DbContext
    /// <summary>
    /// Degenerate override prevents any changes from being saved.
    /// </summary>
    public override int SaveChanges() { return 0; }
    #endregion
}
我有一个创建数据上下文实例的静态方法,如下所示:

public static SlewTargetsDbContext GetTargetDatabase()
{
    var assembly = Assembly.GetExecutingAssembly();
    var assemblyFileName = assembly.Location;
    var path = Path.GetDirectoryName(assemblyFileName);
    var dbFile = Path.Combine(path, "SlewTargets.sdf");
    var builder = new SqlCeConnectionStringBuilder();
    builder.DataSource = dbFile;
    builder.FileMode = "Read Only";
    builder.TempFilePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

    var connectionString = builder.ToString();
    var context = new SlewTargetsDbContext(connectionString);

    return context;
}
最后,我使用如下数据上下文:

Maybe<SlewTarget> LookupTargetFromCoordinates(RightAscension ra, Declination dec)
{
    const double WithinOneMinute = 1.0 / 60.0;    // 1 minute of arc
    var db = CompositionRoot.GetTargetDatabase();

    var targets = from item in db.Targets
                  where item.RightAscension.IsCloseTo(ra.Value, WithinOneMinute) 
                     && item.Declination.IsCloseTo(dec.Value, WithinOneMinute)
                  select item;
    var found = targets.ToList();

    return found.Any() ? new Maybe<SlewTarget>(targets.First()) : Maybe<SlewTarget>.Empty;
}
可能从坐标(赤经ra、赤纬dec)查找目标
{
常数双精度,最小为1.0/60.0;//1分钟弧
var db=CompositionRoot.GetTargetDatabase();
var targets=来自数据库中的项。目标
其中item.RightAstension.IsCloseTo(ra.Value,不超过分钟)
&&项目.偏差.接近(十二月值,不超过分钟)
选择项目;
var found=targets.ToList();
返回find.Any()?new Maybe(targets.First()):Maybe.Empty;
}
运行此代码时,在创建数据上下文实例的位置会出现异常:

无法确定类型为“System.Data.SqlServerCe.SqlCeConnection”的连接的DbProviderFactory类型。确保已在应用程序配置中安装或注册ADO.NET提供程序

我的配置类显式地设置了提供工厂,但是,如果我在代码上设置了断点,它就永远不会被命中。看来EF6忽略了我的配置。我依赖于数据上下文类上的属性,因为我不能使用
app.config
,但这似乎不起作用

我可能错过了一些简单的东西,但我看不到。有什么想法吗

[更新2016-02-16 10:30]从我的数据上下文中删除
[DbConfigurationType]
属性有帮助,现在配置代码正在执行。但是,现在我得到了这个错误:

基础提供程序在打开时失败

例外情况是:

内部错误:无法打开共享内存区域

这是一个
System.Data.SqlServerCe.SqlCeException


这有什么意义吗?

看,也许有帮助。@BWA不幸的是没有。这似乎与连接字符串有关。我的连接字符串正在工作。我开始怀疑这可能与我部署SQL CE的方式有关(我使用“private”方法,您只需将文件捆绑到自己的安装程序中).也许是这样的:如果你和私人deployment@ErikEJ谢谢,我发现了这一点,但没有任何区别。我决定放弃私有部署,并编写了一个安装SQL CE的引导程序。这似乎也不起作用,在绝望中,我重新阅读了所有文档并获得了回报!!结果是我杀了我的通过将
[DbConfigurationType]放在脚上的elf
我的数据上下文中的属性-仅当它与上下文类位于不同的程序集中时,您才应该这样做!!删除了它,现在我的配置代码被命中。尚未删除,但正在进行。成功!!我已将数据库部署到%ProgramData%下的位置,并为所有用户设置了目标文件夹的读/写权限。a(我现在正在工作:)看,也许有帮助。@BWA不幸的是,没有。这似乎与连接字符串有关。我的连接字符串正在工作。我开始怀疑这可能与我部署SQL CE的方式有关(我使用“private”方法,您只需将文件捆绑到自己的安装程序中).也许是这样的:如果你和私人deployment@ErikEJ谢谢,我已经找到了,但没什么区别。我决定放弃私有部署,并编写了一个安装SQLCE的引导程序。这似乎也不起作用,在绝望中,我重新阅读了所有的文档,结果得到了回报!!事实证明,我在我的数据上下文中添加了
[DbConfigurationType]
属性,这是对自己的致命一击——只有当它位于上下文类的不同程序集中时,才应该这样做!!删除它,现在我的配置代码被命中。现在还没有,但是进步。成功!!我已将数据库部署到%ProgramData%下的位置,并为所有用户设置了目标文件夹的读/写权限。现在全部工作:)
Maybe<SlewTarget> LookupTargetFromCoordinates(RightAscension ra, Declination dec)
{
    const double WithinOneMinute = 1.0 / 60.0;    // 1 minute of arc
    var db = CompositionRoot.GetTargetDatabase();

    var targets = from item in db.Targets
                  where item.RightAscension.IsCloseTo(ra.Value, WithinOneMinute) 
                     && item.Declination.IsCloseTo(dec.Value, WithinOneMinute)
                  select item;
    var found = targets.ToList();

    return found.Any() ? new Maybe<SlewTarget>(targets.First()) : Maybe<SlewTarget>.Empty;
}