Есть ли способ, чтобы правильно использовать каркас COR -Framework, это альтернативное соотношение ключей без ручных измC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ, чтобы правильно использовать каркас COR -Framework, это альтернативное соотношение ключей без ручных изм

Сообщение Anonymous »

Недавно я пытался оснастить базу данных с альтернативным отношением ключей, используя C#, Entity Framework Core и SQL Server, я был удивлен, что не смог развернуть схему базы данных без ручных изменений. См. Минимальная настройка базы данных ниже:
Минимальная настройка базы данных
Здесь Полем Зависимая таблица зависит от альтернативной клавиши «Code>». 2022, я должен вручную определить альтернативный ключ в проекте Target C# для правильного развертывания, даже если ключ назван в соответствии с соглашением. < /P>
Что Я пытался: < /p>
  • Создать минимальную настройку базы данных в SQL Server, вместе с пустым проектом C# с правильными пакетами Nuget < /li>
    Run Dotnet EF DBContext Scaffold "" Microsoft.entityFrameWorkCore.sqlServer для каркаса базы данных
    < /ul>
    Это приводит к тому, что следующий код, генерируемый для MinimalReProduceContext.cs < /code>: < /p>

    Код: Выделить всё

    using System;
    using System.Collections.Generic;
    using Microsoft.EntityFrameworkCore;
    
    namespace MinimalReproduce.Scaffold;
    
    public partial class MinimalReproduceContext : DbContext
    {
    public MinimalReproduceContext()
    {
    }
    
    public MinimalReproduceContext(DbContextOptions options)
    : base(options)
    {
    }
    
    public virtual DbSet DependentTables { get; set; }
    public virtual DbSet
     PrincipalTables { get; set; }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    #warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.
    => optionsBuilder.UseSqlServer("");
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    modelBuilder.Entity(entity =>
    {
    entity.HasKey(e => e.DependentId);
    
    entity.ToTable("DependentTable");
    
    entity.Property(e => e.DependentId).ValueGeneratedNever();
    
    entity.HasOne(d => d.Alternate)
    .WithMany(p => p.DependentTables)
    .HasPrincipalKey(p => p.AlternateId)
    .HasForeignKey(d => d.AlternateId)
    .OnDelete(DeleteBehavior.ClientSetNull)
    .HasConstraintName("FK_DependentTable_PrincipalTable");
    });
    
    modelBuilder.Entity(entity =>
    {
    entity.HasKey(e => e.PrimaryId);
    
    entity.ToTable("PrincipalTable");
    
    entity.HasIndex(e => e.AlternateId, "AK_PrincipalTable_AlternateId").IsUnique();
    
    entity.Property(e => e.PrimaryId).ValueGeneratedNever();
    });
    
    OnModelCreatingPartial(modelBuilder);
    }
    
    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
    < /code>
    Я бы ожидал, что EF Core обнаружит альтернативный ключ, особенно потому, что ключ назван в соответствии с соглашением о альтернативном ключе, найденном здесь.  Я ожидаю, что сгенерированный контекст содержит что -то вроде < /p>
    Entity().HasAlternateKey(e => e.AlternateId)
    < /code>
    , но вместо этого есть только < /p>
    entity.HasIndex(e => e.AlternateId, "AK_PrincipalTable_AlternateId").IsUnique()
    < /code>
    Если я продолжу /> [*]dotnet ef migrations add Initial
    для создания начальной миграции
  • Код: Выделить всё

    dotnet ef database update
    для развертывания базы данных
Эта последняя команда, затем ошибки с следующим сообщением:

Код: Выделить всё

Failed executing DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='0']
CREATE UNIQUE INDEX [AK_PrincipalTable_AlternateId] ON [PrincipalTable] ([AlternateId]);
Microsoft.Data.SqlClient.SqlException (0x80131904): The operation failed because an index or statistics with name 'AK_PrincipalTable_AlternateId' already exists on table 'PrincipalTable'.
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) in /_/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs:line 2010
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) in /_/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlInternalConnection.cs:line 770
at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) in /_/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs:line 1421
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) in /_/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/TdsParser.cs:line 2637
at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite) in /_/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs:line 3502
at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean&  usedCache, Boolean asyncWrite, Boolean inRetry, String methodName) in /_/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs:line 1667
at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() in /_/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs:line 1213
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.Execute(IReadOnlyList`1 migrationCommands, IRelationalConnection connection, MigrationExecutionState executionState, Boolean beginTransaction, Boolean commitTransaction, Nullable`1 isolationLevel)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.c.b__3_1(DbContext _, ValueTuple`6 s)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IReadOnlyList`1 migrationCommands, IRelationalConnection connection, MigrationExecutionState executionState, Boolean commitTransaction, Nullable`1 isolationLevel)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.MigrateImplementation(DbContext context, String targetMigration, MigrationExecutionState state, Boolean useTransaction)
at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.c.b__20_1(DbContext c, ValueTuple`4 s)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
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.b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:bdd08de7-8eb9-4603-bb01-6637b3998c78
Error Number:1913,State:1,Class:16
The operation failed because an index or statistics with name 'AK_PrincipalTable_AlternateId' already exists on table 'PrincipalTable'.
Есть ли что -то, что мне не хватает, чтобы сделать эту работу без ручного вмешательства?

Подробнее здесь: https://stackoverflow.com/questions/794 ... lternate-k
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»