使用 EF6 SQL Server CE Code First 创建数据库崩溃

Posted

技术标签:

【中文标题】使用 EF6 SQL Server CE Code First 创建数据库崩溃【英文标题】:Creating a database with EF6 SQL Server CE Code First crashing 【发布时间】:2014-07-10 19:32:44 【问题描述】:

我在运行我的应用程序时看到此错误

[MissingMethodException: Method not found: 'System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher System.Data.Entity.Infrastructure.Interception.DbDispatchers.get_Connection()'.]
   System.Data.Entity.SqlServerCompact.SqlCeProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 timeOut, StoreItemCollection storeItemCollection) +0
   System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection) +75
   System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase() +132

代码:

var db = new AuditDb();
db.Database.CreateIfNotExists(); // blows up! 
or
db.Set<CampaignAudit>().Find(0); // same error

参考文献:

EntityFramework:                  6.0.0.0
EntityFramework.SqlServerCompact: 6.0.0.0
System.Data:                      4.0.0.0
System.Data.SqlServerCe:          4.0.0.0

上下文:

[DbConfigurationType("MvcTest.Data.AuditDBConfiguration, MvcTest")]
public class AuditDb : DbContext

    // tried this approach as well:
    // static AuditDb()  Database.SetInitializer(new CreateDatabaseIfNotExists<AuditDb>()); 
    public AuditDb() : base ("Name=AuditDB")
    public DbSet<CampaignAudit> Audits  get; set; 

    protected override void OnModelCreating(DbModelBuilder builder)
    

        Map<CampaignAudit>(builder);
        ...

数据库配置:

public class AuditDBConfiguration : DbConfiguration

    public AuditDBConfiguration()
    
        SetProviderServices(
            SqlCeProviderServices.ProviderInvariantName,
            SqlCeProviderServices.Instance
        );
        SetDefaultConnectionFactory(
            new SqlCeConnectionFactory(SqlCeProviderServices.ProviderInvariantName)
        );
    

Web.Config:

<add name="AuditDB" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=C:\logs\GroundAuditDb.sdf" />

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
</providers>
<DbProviderFactories>
  <remove invariant="System.Data.SqlServerCe.4.0" />
  <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>

找不到有关此错误的太多信息。似乎某些对象或某些配置中缺少连接属性,或者我正在使用的某些组件的版本不正确。

更新

这太疯狂了。我在另一台机器上重新创建了解决方案(带有 VS 2013 的 Windows 7 sp1)并从头开始获得所有 nuget 项目。

我通过手动创建数据库绕过了数据库创建问题,但现在开始看到此错误:

Could not load type 'System.Data.Entity.Migrations.Model.AlterTableOperation' from assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

所以尝试启用迁移:

Enable-Migrations -ContextTypeName MvcTest.Data.AuditDb

哪个是扔的:

Method not found: 'Void System.Data.Entity.ModelConfiguration.Configuration.EntityMappingConfiguration`1.MapInheritedProperties()

这是一连串的错误,看不到尽头..

有没有人能够使 EF 6 与 SQL CE 代码优先方法一起工作?

【问题讨论】:

你有对 System.Data.Entity 的引用吗(你不应该)? 我没有。我确实参考了 System.Web.Entity 您需要删除/更新它,它是旧的 EntityDataSource 控件 我删除了该引用。没有任何效果。你确定是这个原因吗? System.Data 为 4.0.0.0 我在那里真的充满希望.. 注意到我的框架是 4.5,并在项目属性上将其切换到 4.5.1.. 但这并没有解决这个问题:/跨度> 【参考方案1】:

我的解决方案中遇到了同样的问题。问题是我在解决方案的不同项目中有不同版本的 EntityFramework。我的建议是从所有项目中删除 EntityFramework dll,从 packages.config 中删除有关它的行,然后使用“Install-Package EntityFramework”nuget 命令重新安装。祝你好运!

【讨论】:

我使用的是单项目解决方案。我还验证了我的运行时 bin 中的版本是正确的 我也确实提到我在另一台计算机上进行了全新安装。 我使用的不是 SQL CE,而是一个普通的 sql server 数据库。发生在您身上的事情可能是由于 Microsoft 对 sql CE 的支持缓慢下降所致。我查找了您的错误并看到了一个我跳过的建议:EntityFramework.SqlServer。将此dll添加到您的项目中再试一次:(

以上是关于使用 EF6 SQL Server CE Code First 创建数据库崩溃的主要内容,如果未能解决你的问题,请参考以下文章

EF4 Code First + SQL Server CE:以原子方式保存双向引用

SQL Server CE 4 Entity Framework 4.3.1 Code First 不区分重音和不区分大小写的搜索

如何从 C# 代码将 SQL Server CE 迁移到 SQL Server 2012 Express

从 C# 代码中使用 SQL Server CE 选择 @@ IDENTITY

使用同步框架自动更新到 SQL Server CE 本地数据库

SQL CE 4 和 EF 6 代码优先中不支持默认值