C# 当我无法访问App.config时,如何使用EF6和SQL Server CE数据库?
我对Entity Framework 6和SQL Server CE 4.0的基于代码的配置有问题。我的项目是一个COM组件类库,必须与多个应用程序一起工作,我无法提前知道哪些应用程序将使用该组件,因此我不能使用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 {
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;
}