EF 5代码迁移错误:"数据库中已经存在一个名为_____的对象"

11

正在进行 EF5 代码迁移,在这个过程中遇到一个奇怪的重复问题,现在这个问题已经妨碍了我的工作。尝试运行 update-database 命令时,收到如下错误提示:

 

数据库中已经存在名为“RequestStatus”的对象。

详细的日志信息:

PM> update-database -v
Using StartUp project 'LicensingWorkflow'.
Using NuGet project 'LicensingWorkflow'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'LicensingWorkflow.Models.LicenseWorkflowContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention).
Applying code-based migrations: [201311111934210_AddRequestStatusToContext].
Applying code-based migration: 201311111934210_AddRequestStatusToContext.
CREATE TABLE [dbo].[RequestStatus] (
    [Id] [bigint] NOT NULL IDENTITY,
    [Status] [nvarchar](max),
    CONSTRAINT [PK_dbo.RequestStatus] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'RequestStatus' in the database.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout)
   at 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)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading, Boolean auto)
   at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at 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)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
   at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
ClientConnectionId:38d030fa-496e-4091-88eb-49093d76da14
There is already an object named 'RequestStatus' in the database.

我已经尝试了谷歌上的所有方法,但都没有任何结果:

  • 尝试启动一个新的数据库。
  • 删除__MigrationHistory
  • 这个这个这个

最令人恼火的是,我的同事在相同的代码库中完全没有遇到这个问题。 我使用的是VS2012和EF5的LocalDb。

一些参考代码

数据库初始化程序

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<LicenseWorkflowContext>());

数据库上下文

namespace LicensingWorkflow.Models {
    public class LicenseWorkflowContext : DbContext {

        public DbSet<License> Licenses { get; set; } 
        public DbSet<RequestHistory> RequestHistories { get; set; }
        public DbSet<RequestType> RequestTypes { get; set; }
        public DbSet<HistoryStatus> HistoryStatuses { get; set; }
        public DbSet<Request> Requests { get; set; }
        public DbSet<LicenseStatus> LicenseStatuses { get; set; }
        public DbSet<RequestEntryAnswerReference> RequestEntryAnswerReferences { get; set; }
        public DbSet<Comment> Comments { get; set; }
        public DbSet<SuretyBond> SuretyBonds { get; set; }
        public DbSet<RequestStatus> RequestStatuses { get; set; } 
    }
}

请求的状态,即失败状态。

namespace LicensingWorkflow.Models {
    public class RequestStatus {
        public long Id { get; set; }
        public string Status { get; set; }
    }
}

它是请求模型的一部分

namespace LicensingWorkflow.Models {
    public class Request {
        public long Id { get; set; }
        public string RequesterId { get; set; }
        public string SupervisorId { get; set; }
        public DateTime RequestDate { get; set; }
        public long SurveyId { get; set; }
        public string WorkerId { get; set; }
        public long RequestTypeId { get; set; }
        public string State { get; set; }
        public List<Comment> Comments { get; set; }
        public RequestEntryAnswerReference ReqeustEntryAnswerReference { get; set; }
        public long? LicenseId { get; set; }
        public RequestStatus RequestStatus { get; set; }
    }
}

种子方法 / Configuration.cs

public sealed class Configuration : DbMigrationsConfiguration<LicensingWorkflow.Models.LicenseWorkflowContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        }

        protected override void Seed(LicensingWorkflow.Models.LicenseWorkflowContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );license branch renewal deficiency surrender
            //



            var status1 = new LicenseStatus { Id = 1, Status = "ok" };
            var status2 = new LicenseStatus { Id = 2, Status = "deficient" };
            var status3 = new LicenseStatus{Id = 3, Status = "inactive"};
            context.LicenseStatuses.AddOrUpdate(
                ls => ls.Id,
                status1,
                status2,
                status3
            );

            var license = new License {
                Id = 1,
                LicenseStatus = new LicenseStatus {Status = "ok"},
                LicenseNumber = 12345,
                OwnerId = "022567",
                ObtainedDate = new DateTime(2012, 10, 3),
                ExpirationDate = new DateTime(2013, 12, 12),
                State = "Minnesota",
                Type = "individual"
            };
            var license2 = new License {
                Id = 2,
                LicenseStatus = new LicenseStatus {Status = "deficient"},
                LicenseNumber = 12346,
                OwnerId = "022567",
                ObtainedDate = new DateTime(2012, 10, 3),
                ExpirationDate = new DateTime(2013, 12, 12),
                State = "Texas",
                Type = "individual"
            };

            var license3 = new License {
                Id = 3,
                LicenseStatus = new LicenseStatus { Status = "ok" },
                LicenseNumber = 12347,
                OwnerId = "025253",
                ObtainedDate = new DateTime(2012, 10, 3),
                ExpirationDate = new DateTime(2013, 12, 12),
                State = "Minnesota",
                Type = "individual"
            };
            var license4 = new License {
                Id = 4,
                LicenseStatus = new LicenseStatus { Status = "deficient" },
                LicenseNumber = 12348,
                OwnerId = "025253",
                ObtainedDate = new DateTime(2012, 10, 3),
                ExpirationDate = new DateTime(2013, 12, 12),
                State = "Texas",
                Type = "individual"
            };

            context.Licenses.AddOrUpdate(
                l => l.Id,
                license,
                license2
            );

            context.RequestTypes.AddOrUpdate(
                rt => rt.Id,
                new RequestType { Id = 1, Type = "license" },
                new RequestType { Id = 2, Type = "renewal" },
                new RequestType { Id = 3, Type = "deficiency" },
                new RequestType { Id = 4, Type = "surrender" },
                new RequestType { Id = 5, Type = "branch" },
                new RequestType { Id = 6, Type = "doNotRenew"}
            );

            var requestStatus1 = new RequestStatus() {
                Id = 1,
                Status = "submitted"
            };

            var requestStatus2 = new RequestStatus() {
                Id = 2,
                Status = "approved"
            };

            var requestStatus3 = new RequestStatus() {
                Id = 3,
                Status = "processing"
            };

            var requestStatus4 = new RequestStatus() {
                Id = 4,
                Status = "completed"
            };

            var requestStatus5 = new RequestStatus() {
                Id = 5,
                Status = "withdrawn"
            };

            var requestStatus6 = new RequestStatus() {
                Id = 6,
                Status = "denied"
            };

            context.RequestStatuses.AddOrUpdate(
                rs => rs.Id,
                requestStatus1,
                requestStatus2,
                requestStatus3,
                requestStatus4,
                requestStatus5,
                requestStatus6
            );

            var request1 = new Request {
                Id = 1,
                RequesterId = "123",
                RequestDate = DateTime.Now,
                RequestTypeId = 1,
                SupervisorId = "022567",
                State = "California",
                WorkerId = "",
                SurveyId = 62
            };

            var unassignedRequest1 = new Request{
                Id = 2,
                RequesterId = "123",
                RequestDate = DateTime.Now,
                RequestTypeId = 1,
                SupervisorId = "022567",
                State = "NewMexico",
                WorkerId = ""
            };

            var unassignedRequest2 = new Request {
                Id = 3,
                RequesterId = "123",
                RequestDate = DateTime.Now,
                RequestTypeId = 1,
                SupervisorId = "123",
                State = "Missouri",
                WorkerId = ""
            };

            var unassignedRequest3 = new Request {
                Id = 4,
                RequesterId = "123",
                RequestDate = DateTime.Now,
                RequestTypeId = 1,
                SupervisorId = "123",
                State = "Florida",
                WorkerId = ""
            };

            context.Requests.AddOrUpdate(
                r => r.Id,
                unassignedRequest1,
                unassignedRequest2,
                unassignedRequest3,
                request1
            );

            var requestEntryAnswerReference = new RequestEntryAnswerReference {
                Id = 1,
                RequestId = 1,
                ReferenceKey = "xxxxx-xxxxx-xxxxxx-xxxxx"
            };

            context.RequestEntryAnswerReferences.AddOrUpdate(
                r => r.Id,
                requestEntryAnswerReference
            );

            var comment1 = new Comment(){
                Id = 1,
                CommentText = "Test test test",
                CommenterId = "123",
                PostedDate = DateTime.Now,
                RequestId = 1
            };

            var comment2 = new Comment() {
                Id = 2,
                CommentText = "Test test test",
                CommenterId = "123",
                PostedDate = DateTime.Now,
                RequestId = 1
            };

            var comment3 = new Comment() {
                Id = 3,
                CommentText = "Test test test",
                CommenterId = "123",
                PostedDate = DateTime.Now,
                RequestId = 1
            };

            context.Comments.AddOrUpdate(
                r => r.Id,
                comment1,
                comment2,
                comment3
            );

            request1.Comments = new List<Comment> {
                comment1,
                comment2,
                comment3
            };

            context.Requests.AddOrUpdate(
                r => r.Id,
                request1
            );

            var hstatus1 = new HistoryStatus() { Id = 1, Status = "approved" };
            var hstatus2 = new HistoryStatus() { Id = 2, Status = "denied" };
            var hstatus3 = new HistoryStatus() { Id = 3, Status = "completed" };
            var hstatus4 = new HistoryStatus() { Id = 4, Status = "withdrawl" };
            var hstatus5 = new HistoryStatus() { Id = 5, Status = "assigned" };
            var hstatus6 = new HistoryStatus() { Id = 6, Status = "unassigned" };

            context.HistoryStatuses.AddOrUpdate(
                hs => hs.Id,
                hstatus1,
                hstatus2,
                hstatus3,
                hstatus4,
                hstatus5,
                hstatus6
            );
        }
    }
}
2个回答

1

确保连接字符串的名称与您尝试更新的DbContext名称相同。换句话说,您正在尝试修改现有的数据库。


0

这是因为迁移发生了变化。删除旧数据库并重新运行迁移即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接