2017-04-03 28 views
5

我正在使用EF 6.0和SQL Server CE 4.0。 .sdf文件受密码保护,我通过使用LinqPad打开文件进行了验证。当我尝试打开与下面的连接字符串代码这个数据库,我得到一个异常:如何使用实体框架打开受密码保护的SQL Server CE数据库

指定的密码不匹配数据库的密码

代码:

using (var context = new MyDbContext("ExamManagement")) 
{ 
    context.Database.Initialize(false); 
} 

连接字符串:

<connectionStrings> 
    <add name="ExamManagement" 
     connectionString="Data Source=|DataDirectory|Pikeman.sdf;Max Database Size=4091;Password=123;" 
     providerName="System.Data.SqlServerCe.4.0" /> 
</connectionStrings> 

​​ 堆栈跟踪:

在System.Data.Entity.Core.EntityClient.EntityConnection.Open()
在System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(布尔shouldMonitorTransactions)
在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction [T](Func键1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery
1. <> c__DisplayClass7.b__5()
在System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption)
在系统.Data.Entity.Core.Objects.ObjectQuery 1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
at System.Data.Entity.Internal.LazyEnumerator
1.MoveNext()
在System.Linq.Enumerable.First [TSource(IEnumerable`1源)

+0

您很可能使用了错误的连接字符串 – ErikEJ

+0

请参阅我的更新屏幕截图。看起来连接字符串是正确的,但是'Password'部分被忽略。 –

+0

您是否正在linqpad中测试正确的数据库文件?查看你的bin/debug文件夹 - 可能有一个sdf文件的副本! – ErikEJ

回答

1

连接字符串是OK(我通常不指定最大数据库大小,你可以尝试删除的参数,但我我很确定这不是问题)。
因此,在你的情况下,我认为你可能打开一个数据库与不同的密码(如异常暗示)或者你打开一个错误的数据库。 尝试指定一个绝对路径,并从路径打开数据库,例如

<connectionStrings> 
    <add name="ExamManagement" 
     connectionString="Data Source=C:\temp\Pikeman.sdf;Password=123;" 
     providerName="System.Data.SqlServerCe.4.0" /> 
</connectionStrings> 
+0

好的。发现问题。问题在于默认的DbContext构造函数使用的默认连接字符串与'app.config'文件中的不同。当DbMigrationsConfiguration为数据库播种时,它会使用默认连接字符串,而不需要密码,恰好指向与'app.config'连接字符串相同的目录。 –

相关问题