我遇到了基于代码的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
。
这会响铃吗?