我創建了小型的Web API,但是當我要把我的模型類遷移到物理資料庫時,它給了我一個錯誤。當我使用Add-Migration時,專案是正常的。當我試圖使用Update-Database時,這個錯誤就發生了:
Build started...
構建成功了。
失敗。Microsoft.EntityFrameworkCore.Database.Command[20102] 。
執行DbCommand失敗(111ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [Books] (
[Id] int NOT NULL IDENTITY,
[標題] nvarchar(100) NULL,
[作者] nvarchar(100) NULL。
[描述] nvarchar(100) NULL。
CONSTRAINT [PK_Books] PRIMARY KEY ([Id])
);
執行DbCommand失敗(111ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [Books] (
[Id] int NOT NULL IDENTITY,
[標題] nvarchar(100) NULL,
[作者] nvarchar(100) NULL。
[描述] nvarchar(100) NULL。
CONSTRAINT [PK_Books] PRIMARY KEY ([Id])
);
Microsoft.Data.SqlClient.SqlException(0x80131904)。資料庫中已經有一個名為'Books'的物件。
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite)
at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName)
at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String connectionString, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String connectionString, String contextType)
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:0b41a251-3fe9-4c55-a2fd-118e7348a564
錯誤編號:2714,狀態:6,類別:16
資料庫中已經有一個名為'Books'的物件。
在我的SQL Server資料庫中,沒有名為 "書籍 "的表。為什么我會得到這個錯誤,我怎樣才能解決這個問題呢?
uj5u.com熱心網友回復:
你可能在某個地方創建了一個表,或者是你看錯了資料庫。你可以檢查連接字串,看看它呼叫的是哪個資料庫,看看那里的表是否存在。
你也可以添加一個檢查,看看表在創建之前是否存在。
IF NOT EXISTS<
(
SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Books])
)
BEGIN
創建 TABLE [dbo].[Books]
....
END
uj5u.com熱心網友回復:
當你更新內容,然后嘗試洗掉檔案或或物件,而不嘗試正確恢復背景關系時,這樣的事情可能發生。下面我將介紹解決這個問題的方法,或者你可能遇到的問題。
解決方案1 - 洗掉它
。這個方法是我用來清除那些我犯了錯誤的表的沖突,而且更新它并不是一個真正的選擇。但是在你沒有更好地掌握EF的作業方式之前,我不會推薦這種方法。
當EF說物件已經存在時--它可能不是指表,而是指你的某個遷移檔案中定義的物件。但是要完全清除一個物件(手動),有兩件事你要做:
解決方案2--恢復它
這是我推薦的一種方法,我認為剛接觸EF核心的人應該使用:恢復你的遷移。
用以下方法恢復你的遷移。Update-Database <previous-migration-name>。選擇在你定義Books物件之前的一個早期遷移。然后再次更新遷移,如果你沒有在你的背景關系中定義DbSet<Books>兩次的話,它應該可以作業。
解決方案3--隨遇而安
。另一個供初學者使用的方法是使用腳手架從資料庫中下載背景關系。這將下載您正在使用的資料庫以及其中的所有物件--然后您可以根據您的需要進行更改。
Scaffold-DbContext "<Connection String>" Microsoft.EntityFrameworkCore.SqlServer -OutputDir <Directory>
建議
我想說的是,首先使用方法2,如果不成功,則使用方法1,最后是方法3。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309875.html
標籤:
