实体框架核心错误:dotnet.exe:System.Data.SqlClient.SqlException(0x80131904):数据库中已有一个名为“Company”的对象

时间:2016-11-29 08:32:25

标签: sql asp.net-mvc entity-framework asp.net-core asp.net-core-mvc

我正在构建一个使用ASP.NET Core MVC6和Entity Framework Core代码的应用程序,首先构建在DB上下文中,SQL数据库已经填充了数据记录。我最近对数据模型进行了一些小的更改并重新创建了迁移,在VS 2015 Package Manager控制台中使用了命令(“dotnet ef迁移添加Stage3”,“dotnet ef数据库更新”),但它遇到了错误:

dotnet.exe : System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Company' in the database.

公司表位于表关系的顶部,似乎因为表公司已经存在并且EF无法更新新的表结构。如果我在连接字符串中更改DB名称,它将创建具有新表结构的新数据库,而不会出现任何问题。我不确定如何解决这个问题?应用程序在不久的将来上线之后,我将对模式进行更多更改并再次出现同样的问题,我无法使用实时数据删除数据库来重新创建新的表结构,也许我应该在Startup.cs文件中对其进行配置,但我还没有找到任何有用的资源。请给我一些建议。

我试图将DB Initializer更改为附加的屏幕截图,但不确定如何操作。 enter image description here

我再次检查了项目代码,迁移尚未应用于__MigrationHistory表,迁移代码实际上包含了创建整个数据库结构的代码,如下所示:

 migrationBuilder.CreateTable(
            name: "Company",
            columns: table => new
            {
                CompanyId = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                CompanyName = table.Column<string>(maxLength: 100, nullable: false),
                IsAdmin = table.Column<bool>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Company", x => x.CompanyId);
            });

我没有更改项目命名空间。最近我刚刚对几个表关系做了一些更改,例如站点用户权限表(公司有很多站点)。我添加了一个权限表,所以现在站点用户权限表可以有多种权限类型而不是单一权限类型。

不确定如何在Entity框架核心中设置自动迁移。

1 个答案:

答案 0 :(得分:0)

在实体框架代码第一个approch中,有四种不同的数据库初始化策略:

  • CreateDatabaseIfNotExists :这是默认初始值设定项。作为名称 建议,如果不存在,它将创建数据库 组态。但是,如果更改模型类然后运行 使用此初始化程序的应用程序,然后它将抛出一个 异常。

  • DropCreateDatabaseIfModelChanges :如果您的模型类,此初始化程序将删除现有数据库并创建新数据库 (实体类)已被更改。所以你不必担心 在模型类更改时维护数据库模式。

  • DropCreateDatabaseAlways :顾名思义,每次运行应用程序时,此初始化程序都会删除现有数据库, 无论您的模型类是否已更改。这个 当你想要新鲜的数据库时,每次运行时都会很有用 应用程序,就像您正在开发应用程序一样。

  • 自定义数据库初始化程序:您也可以创建自己的自定义初始值设定项,如果上述任何一项不满足您的要求或 你想做一些其他使用初始化数据库的过程 上面的初始化程序。

因此,如果您正在使用DropCreateDatabaseIfModelChanges或DropCreateDatabaseAlways,则将其替换为CreateDatabaseIfNotExists。

请试一试。