Подтвердить что ты не робот

Entity Framework 5 Несколько столбцов идентификации, заданных для таблицы. Допускается только один столбец для каждой таблицы.

Я создаю эту модель как часть моей первой структуры сущности кода

public class NewUserRegistration
{
    [Key]
    public int NewUserRegistrationId { get; set; }    
}

Используя команду Update-Database -Verbose -Force в консоли управления пакетами, я получаю это исключение во время этого бита обновления Applying automatic migration: 201211252223088_AutomaticMigration.

ALTER TABLE [dbo]. [NewUserRegistration] ADD [NewUserRegistrationId] [int] NOT NULL IDENTITY System.Data.SqlClient.SqlException(0x80131904): несколько столбцов идентификации, указанных для таблицы 'NewUserRegistration. Допускается только один столбец для каждой таблицы. в System.Data.SqlClient.SqlConnection.OnError(исключение SqlException, Boolean breakConnection, Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) при System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable 1 migrationStatements) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable 1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable 1 операция, Boolean понижение, Boolean auto) при System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, исходный код XDocument, XDocument targetModel, Boolean понижение) на System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, исходный код XDocument, XDocument targetModel, Boolean понижение) на System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
в System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) в System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() в System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId: a39395da-5f2b-48e0-bdac-b48d75a68c68 Несколько столбцы идентификации, указанные для таблицы "NewUserRegistration". Единственный столбец с идентификатором для таблицы.

Здесь явно указана только одна колонка Identity. Так почему это так?

Когда я делаю это, я не получаю исключения.

public class NewUserRegistration
{
    [Key]
    public int Id { get; set; }    
}

Любые мысли о том, почему это так?

ИЗМЕНИТЬ

Я должен сказать, что меняю имя ключа. В комментариях говорится, что вы не можете просто сделать это. Как я могу бросить и воссоздать?

Лучше ли удалять базу данных из SQL, а затем снова запустить команду Update-Database?

4b9b3361

Ответ 1

Я столкнулся с той же ошибкой при попытке переименовать столбец Key. Чтобы выполнить миграцию, мне пришлось переупорядочить порядок операций в моей миграции лесов script.

Здесь я сначала заказывал операции Drop, а затем добавил новое поле Key.

public partial class RenameKey : DbMigration
{
    public override void Up()
    {
        DropPrimaryKey("dbo.GameSummary", new[] { "OldId" });
        DropColumn("dbo.GameSummary", "OldId");
        AddColumn("dbo.GameSummary", "Id", c => c.Int(nullable: false, identity: true));
        AddPrimaryKey("dbo.GameSummary", "Id");
    }

Надеюсь, что это поможет в вашем случае.

Ответ 2

У меня также не было никаких проблем, просто заменив соответствующие команды DropPrimaryKey, DropColumn, AddColumn и AddPrimaryKey командой RenameColumn, например

public partial class RenameKey : DbMigration
{
    public override void Up()
    {    
        RenameColumn("dbo.GameSummary", "OldId", "Id");
    }
}

Ответ 3

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

Ответ 4

Вы можете просто изменить имя столбца непосредственно из класса, используя что-то вроде этого:

[Column("ProductID")]

Пример:

namespace Z_Market.Models
{
    public  class Product
    {
        [Key, Column("ProductID")]  //This change the name of the column when you are using migration.  If you have a form created already, you have to change the connection in the for to aim the new column name.  
        public int ID { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
        public DateTime LastBuy { get; set; }
        public float Stock { get; set; }
        public string remarks { get; set; }
        public string deleteme { get; set; }

        public ICollection<SupplierProduct> SupplierProducts { get; set; }
    }
}