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

Я создаю эту модель как часть моего кода first entity framework

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

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

ALTER TABLE [dbo].[NewUserRegistration] добавить [NewUserRegistrationId] [int] не нулевая система идентификации.Данные.В sqlclient.Sqlexception в (0x80131904): несколько столбцов идентификаторов, указанных в таблице "NewUserRegistration". Только один столбец идентификаторов допускается таблица. в системе.Данные.В sqlclient.Объект sqlconnection.OnError (исключение SqlException, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) на Система.Данные.В sqlclient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at Система.Данные.В sqlclient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, sqldatareader поток данных, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at Система.Данные.В sqlclient.Свойство sqlcommand.RunExecuteNonQueryTds (Строка methodName, Boolean async, int32 timeout) at Система.Данные.В sqlclient.Свойство sqlcommand.InternalExecuteNonQuery (TaskCompletionSource1 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(IEnumerable1 migrationStatements) at Система.Данные.Сущность.Миграции.Инфраструктура.MigratorBase.Execute Операторы(Интерфейс IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable1 операции, логическое понижение, Boolean auto) на Система.Данные.Сущность.Миграции.DbMigrator.AutoMigrate(Строка migrationId, SourceModel XDocument, в targetModel XDocument, в логическое понижение) на Система.Данные.Сущность.Миграции.Инфраструктура.MigratorLoggingDecorator.AutoMigrate(Строка migrationId, sourceModel XDocument, в targetModel XDocument, в логическое понижение) на Система.Данные.Сущность.Миграции.DbMigrator.Обновление(Интерфейс IEnumerable1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
в системе.Данные.Сущность.Миграции.DbMigrator.Обновление(Строка targetMigration) at Система.Данные.Сущность.Миграции.Инфраструктура.MigratorBase.Обновление(Строка targetMigration) at Система.Данные.Сущность.Миграции.Дизайн.ToolingFacade.UpdateRunner.RunCore() в системе.Данные.Сущность.Миграции.Дизайн.ToolingFacade.BaseRunner.Бежать() ClientConnectionId:a39395da-5f2b-48e0-bdac-b48d75a68c68 несколько столбцы идентификаторов, указанные для таблицы "NewUserRegistration". Единственный столбец идентификаторов для каждой таблицы разрешен.

существует только один столбец идентификаторов указанный. Так почему же это так?

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

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

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

редактировать

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

лучше всего удалить базу данных из SQL, а затем просто запустить опять?

5 ответов


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

здесь я сначала заказал операции удаления, а затем добавил новое ключевое поле.

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");
    }

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


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


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


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

[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; }
    }
}

первый Add-Migration -Name тогда

public override void Up()
{    
    RenameColumn("dbo.Department", "OldId", "NewId");
}