Как я могу добавить то же имя таблицы, но другую схему в EntityFramework?

#c# #entity-framework #database-migration #entity-framework-migrations #database-schema

Вопрос:

У меня есть ситуация, когда мне нужно создать новую таблицу в отдельной схеме с помощью EntityFramework, которая имеет то же имя таблицы в другой схеме.

Как это можно сделать с помощью EntityFramework? В настоящее время я заблокирован для EntityFramework 5.0.4, поэтому я не могу перейти к EntityFramework 6.

Существующая таблица:

 CREATE TABLE dbo.TableA ( /*table contents*/ );
 

Новая таблица:

 CREATE TABLE AnotherSchema.TableA ( /*table contents*/ );
 

Я считаю, что я уже правильно создал классы POCO, а MigrationBuilder Up() и Down() методы явно используют имена схем:

 protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.EnsureSchema(name: "AnotherSchema");
    migrationBuilder.CreateTable(schema: "AnotherSchema", name: "TableA", ...);
    // ...
}

protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropTable(schema: "AnotherSchema", name: "TableA");
}
 

Однако при выполнении Update-Database я получаю следующую ошибку:

 PM> Update-Database
Build started...
Build succeeded.
Applying migration 'xxxxxxxxxx'.
Failed executing DbCommand (55ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [AnotherSchema].[TableA] (
    /*table contents*/
);
Microsoft.Data.SqlClient.SqlException (0x80131904): There is already an object named 'TableA' in the database.
   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, Booleanamp; 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, Booleanamp; 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)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:xxxxxxxx
Error Number:2714,State:6,Class:16
There is already an object named 'TableA' in the database.
PM> 
 

Комментарии:

1. Почему вы СОЗДАЕТЕ ТАБЛИЦУ каждый раз при запуске приложения? создать таблицу следует использовать только в том случае, если таблица не существует.

2. Журнал указывает, что EF пытается создать таблицу в другой схеме. Вы уверены, что он еще не там?

3. @jdweng Я пытаюсь выполнить таблицу СОЗДАНИЯ как одноразовую, не каждый раз при запуске приложения.

4. @DavidBrowne-Microsoft У меня открыта SSMS, и я вижу, что новая таблица действительно еще не существует; единственная таблица, которая существует, находится в другой схеме. Я также проверил с помощью прямого запроса к sys.tables (на случай, если пользовательский интерфейс SSMS не обновлялся должным образом).

5. Затем вам нужно проверить, существует ли таблица. Возможно, используйте GetSchema, чтобы узнать, есть ли таблица в базе данных.