EF7使用SQLite生成错误的迁移

脸红

我尝试将ASP.Net 5与Entity Framework 7和SQLite结合使用,但发现了migrator的奇怪行为。

我使用了Visual Studio 2015,并使用模板“ ASP.NET 5模板Web应用程序”创建了一个新项目。

之后,我删除了依赖

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"

并添加了两个依赖项,而不是所谓的还原包。

"EntityFramework.Sqlite": "7.0.0-rc1-final",
"Microsoft.Data.Sqlite": "1.0.0-rc1-final"

像那样

"dependencies": {
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.Sqlite": "7.0.0-rc1-final",
"Microsoft.Data.Sqlite": "1.0.0-rc1-final",
"Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
"Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
}

接下来,我去了Startup.cs并像这样更改了功能ConfigurationServices

 public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        var dbFilePath =     Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "test.db");
        services.AddEntityFramework()
         .AddSqlite()
         .AddDbContext<ApplicationDbContext>(options =>
             options.UseSqlite("Filename=" + dbFilePath));
        System.Console.WriteLine("Use DB file:" + dbFilePath);

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();
        services.AddInstance<IConfigurationRoot>(Configuration);
    }

然后,我从“迁移”文件夹中删除了所有文件,并构建了解决方案。所有人都准备好创建迁移。我在项目文件夹上运行git bash并执行以下命令:

blush@BLUSH /d/dev/testMVC
$ dnx ef migrations add firstMigration
Use DB file:D:\dev\testMVC\test.db
Done. To undo this action, use 'ef migrations remove'

$ dnx ef database update
Use DB file:D:\dev\testMVC\test.db
Applying migration '20160304130532_firstMigration'.
Done.

好的,我看到一个数据库文件和文件夹“ Migrations”中的文件看起来不错。而且我猜想在不更改对象模型的情况下,下一个生成的迁移将为空。我试图这样做,然后输入下一个命令:

$ dnx ef migrations add testMigration
Use DB file:D:\dev\testMVC\test.db
Done. To undo this action, use 'ef migrations remove'

我去看了一个生成的迁移类,并且看到了以下代码:

 protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey(name: "FK_IdentityRoleClaim<string>_IdentityRole_RoleId", table: "AspNetRoleClaims");
            migrationBuilder.DropForeignKey(name: "FK_IdentityUserClaim<string>_ApplicationUser_UserId", table: "AspNetUserClaims");
            migrationBuilder.DropForeignKey(name: "FK_IdentityUserLogin<string>_ApplicationUser_UserId", table: "AspNetUserLogins");
            migrationBuilder.DropForeignKey(name: "FK_IdentityUserRole<string>_IdentityRole_RoleId", table: "AspNetUserRoles");
            migrationBuilder.DropForeignKey(name: "FK_IdentityUserRole<string>_ApplicationUser_UserId", table: "AspNetUserRoles");
            migrationBuilder.AddForeignKey(
                name: "FK_IdentityRoleClaim<string>_IdentityRole_RoleId",
                table: "AspNetRoleClaims",
                column: "RoleId",
                principalTable: "AspNetRoles",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
            migrationBuilder.AddForeignKey(
                name: "FK_IdentityUserClaim<string>_ApplicationUser_UserId",
                table: "AspNetUserClaims",
                column: "UserId",
                principalTable: "AspNetUsers",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
            migrationBuilder.AddForeignKey(
                name: "FK_IdentityUserLogin<string>_ApplicationUser_UserId",
                table: "AspNetUserLogins",
                column: "UserId",
                principalTable: "AspNetUsers",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
            migrationBuilder.AddForeignKey(
                name: "FK_IdentityUserRole<string>_IdentityRole_RoleId",
                table: "AspNetUserRoles",
                column: "RoleId",
                principalTable: "AspNetRoles",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
            migrationBuilder.AddForeignKey(
                name: "FK_IdentityUserRole<string>_ApplicationUser_UserId",
                table: "AspNetUserRoles",
                column: "UserId",
                principalTable: "AspNetUsers",
                principalColumn: "Id",
                onDelete: ReferentialAction.Cascade);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
       ... 
       }

如果我尝试应用此迁移,请捕获下一条错误消息:

$ dnx ef database update
Use DB file:D:\dev\testMVC\test.db
Applying migration '20160304133144_testMigration'.
System.NotSupportedException: SQLite cannot support this migration operation.
   в Microsoft.Data.Entity.Migrations.SqliteMigrationsSqlGenerator.Generate(Drop
ForeignKeyOperation operation, IModel model, RelationalCommandListBuilder builde
r)
   в Microsoft.Data.Entity.Migrations.MigrationsSqlGenerator.<>c.<.cctor>b__50_1
0(MigrationsSqlGenerator g, MigrationOperation o, IModel m, RelationalCommandLis
tBuilder b)
   в Microsoft.Data.Entity.Migrations.MigrationsSqlGenerator.Generate(MigrationO
peration operation, IModel model, RelationalCommandListBuilder builder)
   в Microsoft.Data.Entity.Migrations.MigrationsSqlGenerator.Generate(IReadOnlyL
ist`1 operations, IModel model)
   в Microsoft.Data.Entity.Migrations.SqliteMigrationsSqlGenerator.Generate(IRea
dOnlyList`1 operations, IModel model)
   в Microsoft.Data.Entity.Migrations.Internal.Migrator.GenerateUpSql(Migration
migration)
   в Microsoft.Data.Entity.Migrations.Internal.Migrator.<>c__DisplayClass12_4.<G
etMigrationCommands>b__10()
   в Microsoft.Data.Entity.Migrations.Internal.Migrator.Migrate(String targetMig
ration)
   в Microsoft.Data.Entity.Design.MigrationsOperations.UpdateDatabase(String tar
getMigration, String contextType)
   в Microsoft.Data.Entity.Commands.Program.Executor.<>c__DisplayClass7_0.<Updat
eDatabase>b__0()
   в Microsoft.Data.Entity.Commands.Program.Executor.Execute(Action action)
SQLite cannot support this migration operation.

还有一个问题:我该怎么做才能解决此问题?

natemcmaster

这是SQLite的局限性。请参阅EF中的SQLite限制

发生这种情况是因为SQLite本身不支持“ ADD FOREIGN KEY”。解决此问题的方法是进行表重建。在sqlite.org上进行其他类型的表架构更改可提供有关如何构建查询的说明。您将很快了解到SQLite上的混乱情况,以及EF为什么不为您自动执行此操作。

如果您不需要SQLite数据库中的数据,则最好将其删除,然后使用context.Database.EnsureCreated()新模型从头开始重建表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在实体属性中使用NotMapped属性时,EF7添加迁移错误

来自分类Dev

EF7 DBContext的配置错误?

来自分类Dev

EF7错误插入默认日期

来自分类Dev

迁移到MVC6 / EF7:PluralizingTableNameConvention

来自分类Dev

使用EF7的存储库模式

来自分类Dev

EF7代理集合未生成

来自分类Dev

使用EF7(EF Core)的UWP数据绑定

来自分类Dev

如何修复EF7中的此错误?

来自分类Dev

EF7和SQLite麻烦大了,我可以将SQL Server CE与Mobile一起使用吗?

来自分类Dev

EF7 .NET Core 1 RC2添加迁移失败

来自分类Dev

EF7迁移-实体类型“”对应的CLR类型不可实例化

来自分类Dev

手动编辑EF7迁移类和快照

来自分类Dev

使用EF7和VNext访问DBContext

来自分类Dev

如何使用EF在SQLite中启用迁移

来自分类Dev

多对多EF7

来自分类Dev

数据库迁移在EF Core中生成错误的表设计(使用AspNetUsers的多对多)

来自分类Dev

EF7(代码优先)+ SQLite不会创建数据库和模型表

来自分类Dev

在EF7中加载参考

来自分类Dev

EF7一对多映射

来自分类Dev

EF7不保存对象图

来自分类Dev

EF7一对多映射

来自分类Dev

代替EF7中的DbSet Create()方法使用什么,建议仅使用新的T()

来自分类Dev

在EF7中为谓词使用参数时,为什么不能使用ToListAsync()?

来自分类Dev

尝试在EF7和ASP.NET5中使用DbSet <TEntity> .Where()

来自分类Dev

使用EF7命令时IHostingEnvironment.WebRootPath为null

来自分类Dev

是否可以在EF7中使用流畅的API添加CHECK约束?

来自分类Dev

如何使用EF7 Fluent API为单个POCO创建两个表?

来自分类Dev

是否可以使用EF7执行自定义SQL查询

来自分类Dev

在EF7中将参数用作谓词时,为什么不能使用ToListAsync()?

Related 相关文章

热门标签

归档