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

时间:2016-02-15 21:46:22

标签: 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
{
    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 class DataConfiguration : DbConfiguration
{
    public DataConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlServerCe.4.0", () => new DefaultExecutionStrategy());
        SetProviderFactory("System.Data.SqlServerCe.4.0", new SqlCeProviderFactory());
        SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance);
    }
}

我有一个静态方法,可以创建数据上下文的实例,如下所示:

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;
}

当我运行此代码时,我在创建数据上下文实例时出现异常:

  

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

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

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

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

  

底层提供程序在Open上失败。

InnerException是:

  

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

那是System.Data.SqlServerCe.SqlCeException

这会响铃吗?

0 个答案:

没有答案