C# 使用EF Core 2.0迁移使用新列更新表
我是EF Core的新手,一直在学习一门在线课程和一本书。我创建了我的数据库上下文并使用了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
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类,以确定数据库需要的完整架构
- 您的迁移类,以确定需要应用于数据库的(增量)模式(以及为新迁移生成的代码)
- 现有数据库的迁移历史记录表(如果存在并且有),以确定已应用了哪些迁移
- 您的迁移类,查看是否有尚未应用的迁移
因此,当您收到您发布的错误时,这意味着:
- 您的第二次迁移是在没有考虑现有迁移的情况下创建的(您在迁移之间更改了名称空间,指向了错误的迁移文件夹,等等)
- 新迁移包括旧迁移的更改
- 您对已经应用了一个或多个迁移但没有(正确的)迁移历史记录的数据库调用了更新
- 同一迁移被应用多次