【问题标题】:Entity Framework Core Error: dotnet.exe : System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Company' in the database实体框架核心错误:dotnet.exe:System.Data.SqlClient.SqlException (0x80131904):数据库中已经有一个名为“公司”的对象
【发布时间】:2016-11-29 08:32:25
【问题描述】:

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

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

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

我已尝试将 DB Initializer 更改为附加的屏幕截图,但不知道该怎么做。

我再次检查了项目代码,迁移尚未应用到 __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);
            });

而且我没有更改项目命名空间。最近我只是对站点用户权限表(公司有很多站点)等少数表关系进行了一些更改。我添加了一个权限表,所以现在站点用户权限表可以有多个权限类型而不是单一权限类型。

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

【问题讨论】:

  • 您可以发布对公司所做的更改吗?
  • company 表没做改动,最近只是对站点用户权限表等少数表关系做了一些改动(公司有很多站点)。我添加了一个权限表,所以现在站点用户权限表可以有多个权限类型而不是单一权限类型。

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


【解决方案1】:

在Entity framework code first approch中,有四种不同的数据库初始化策略:

  • CreateDatabaseIfNotExists:这是默认初始化程序。正如名字 建议,如果不存在数据库,它将根据 配置。但是,如果您更改模型类然后运行 具有此初始化程序的应用程序,然后它将抛出一个 例外。

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

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

  • 自定义 DB 初始化程序:如果上述任何一项不满足您的要求或 你想做一些其他的过程来初始化数据库使用 上面的初始化器。

因此,如果您使用的是 DropCreateDatabaseIfModelChanges 或 DropCreateDatabaseAlways,请将其替换为 CreateDatabaseIfNotExists。

请尝试一下。

【讨论】:

  • 您好,感谢您的回复,但我已经在 ApplicationDbContext.cs 文件中使用了默认初始化程序,我假设它是 CreateDatabaseIfNotExists,请告知。
  • 好的 请试试这个链接stackoverflow.com/questions/24169140/…
  • 感谢您的回复,这个例子是旧版本的Entity框架,我用的是EF核心,所以EF核心没有-IgnoreChanges命令参数,不知道如何设置自动迁移在实体框架核心?
  • 抱歉,我没有注意到您在 EF 核心中遇到过这个问题。此链接对您在 EF 核心中设置自动迁移有帮助吗druss.co/2016/01/…
  • 您好,我已尝试将 context.Database.Migrate() 应用于我的种子数据类,但 Migrate() 方法不可用。而且它似乎只适用于运行 MVC 项目。我遇到的问题是,当我在 VS 2015 包管理器控制台中使用 EF 核心迁移命令更新数据库时,还不能运行该项目。
猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多