如何在 EntityFramework 中添加相同的表名但不同的架构?

问题描述

我有一种情况,我需要通过 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,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,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 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> 

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)