C# 使用EF Core 2.0迁移使用新列更新表

C# 使用EF Core 2.0迁移使用新列更新表,c#,entity-framework,.net-core,entity-framework-migrations,C#,Entity Framework,.net Core,Entity Framework Migrations,我是EF Core的新手,一直在学习一门在线课程和一本书。我创建了我的数据库上下文并使用了dotnet ef migrations add init,然后是dotnet ef数据库更新,这一切都让我非常高兴。我在模型中添加了一个新列,创建并应用了一个新迁移,但遇到了以下问题: > Applying migration '20180417175820_AddOsTypeColumn'. Failed executing DbCommand (1ms) [Parameters=[], Comm

我是EF Core的新手,一直在学习一门在线课程和一本书。我创建了我的数据库上下文并使用了
dotnet ef migrations add init
,然后是
dotnet ef数据库更新
,这一切都让我非常高兴。我在模型中添加了一个新列,创建并应用了一个新迁移,但遇到了以下问题:

> Applying migration '20180417175820_AddOsTypeColumn'.
Failed executing DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [MachineTypes] (
    [MachineTypeID] int NOT NULL IDENTITY,
    [Description] varchar(15) NULL,
    CONSTRAINT [PK_MachineTypes] PRIMARY KEY ([MachineTypeID])
);
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'MachineTypes' in the database.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInA
ction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrap
CloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectio
nLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, B
ulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean as
yncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, In
t32 timeout, Boolean asyncWrite, String methodName)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbComma
ndMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection,
 IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadO
nlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migration
Commands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String c
ontextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:09aa3af2-6ce8-4331-a586-c79841f4e1b6
Error Number:2714,State:6,Class:16
There is already an object named 'MachineTypes' in the database.
>应用迁移“20180417175820_AddOsTypeColumn”。
执行DbCommand(1ms)失败[Parameters=[],CommandType='Text',CommandTimeout='30']
创建表[MachineTypes](
[MachineTypeID]int非空标识,
[说明]varchar(15)NULL,
约束[PK_MachineTypes]主键([MachineTypeID])
);
System.Data.SqlClient.SqlException(0x80131904):数据库中已存在名为“MachineTypes”的对象。
位于System.Data.SqlClient.SqlConnection.OneError(SqlException异常,布尔断开连接,操作'1 wrapCloseInA
(行动)
位于System.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常,布尔断开连接,操作'1
(不作为)
在System.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject stateObj,布尔调用者连接
nLock,布尔异步关闭)
在System.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,B
ulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、Boolean和dataReady)
位于System.Data.SqlClient.SqlCommand.RunExecuteOnQueryTds(字符串方法名,布尔异步,Int32超时,布尔值为
yncWrite)
位于System.Data.SqlClient.SqlCommand.InternalExecuteOnQuery(TaskCompletionSource`1 completion,布尔sendToPipe,In
t32超时,布尔异步写入,字符串方法名)
位于System.Data.SqlClient.SqlCommand.ExecuteOnQuery()处
在Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection连接,db逗号
ndMethod executeMethod,IReadOnlyDictionary`2参数值)
在Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteOnQuery(IRelationalConnection)中,
IREADONLYDICTIONAL`2参数值)
在Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteOnQuery(IRelationalConnection连接,IRelationalConnection)中
NLYDICTIONAL`2参数值)
位于Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecutionQuery(IEnumerable`1迁移
命令,iRelational连接)
位于Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(字符串targetMigration)
位于Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(字符串targetMigration,字符串c
ontextType)
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.c__DisplayClass0_1.b__0()中
位于Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作)
客户连接ID:09aa3af2-6ce8-4331-a586-c79841f4e1b6
错误号:2714,状态:6,类别:16
数据库中已存在名为“MachineTypes”的对象。
我看了这篇文章,它最初的问题和我的一样,但提供的唯一解决方案并不真正适合我的情况;我的日志表明它正在应用正确的迁移,但随后尝试创建一个现有表,就好像它正在运行init迁移一样

由于它只是一个练习/学习数据库,我从SQL Server中删除了它,然后重新开始。这一次,按照上述步骤进行操作,效果如预期。这次我注意到的唯一区别是,在添加新列/新迁移时,我没有连接到数据库。这就是原因吗

这次我注意到的唯一区别是,在添加新列/新迁移时,我没有连接到数据库。这就是原因吗

我想你把这里的术语弄混了。添加新列是对数据库的操作;添加新迁移是项目上的一项操作

在不连接数据库的情况下更新数据库是不可能的,因此我假设您正在谈论更改模型/添加迁移。EF没有为此查看任何数据库,所以没有

澄清(假设代码优先)

当您创建迁移(添加迁移)时,EF将关注以下两个方面:

  • 您的DbContext类,以确定数据库需要的完整架构
  • 您的迁移类,以确定需要应用于数据库的(增量)模式(以及为新迁移生成的代码)
当您应用迁移(更新数据库)时,EF将关注以下两个方面:

  • 现有数据库的迁移历史记录表(如果存在并且有),以确定已应用了哪些迁移
  • 您的迁移类,查看是否有尚未应用的迁移

因此,当您收到您发布的错误时,这意味着:

  • 您的第二次迁移是在没有考虑现有迁移的情况下创建的(您在迁移之间更改了名称空间,指向了错误的迁移文件夹,等等)
    • 新迁移包括旧迁移的更改
  • 您对已经应用了一个或多个迁移但没有(正确的)迁移历史记录的数据库调用了更新
    • 同一迁移被应用多次

我想我可能已经发现了这个问题,它似乎与您的第二点有关。我在OneDrive上有我的项目,并试图在我的工作笔记本上重新创建该项目。我猜迁移类是特定于数据库/项目的;我也复制了迁移文件,认为它们可以工作。看来情况并非如此。当我试着做这个的时候