نجح تحديث قاعدة بيانات Entity Framework Migration ولكن لم تتم إضافة عمود قاعدة البيانات

StackOverflow https://stackoverflow.com//questions/24007883

سؤال

أنا أستخدم Entity Framework في VS2012 مع SQL Server 2008 R2.لقد قمت بتمكين الترحيل، وأقوم بإضافة حقل سلسلة (على سبيل المثال.DropboxUrl) إلى إحدى فئات قاعدة البيانات الخاصة بي (على سبيل المثال.تصميمات).

// Design.cs

public class Design
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }

        [StringLength(Constants.DESIGN_NAME_MAX_LENGTH)]
        public string Name { get; set; }

        [StringLength(Constants.DESIGN_DESC_MAX_LENGTH)]
        public string Description { get; set; }

        public ItemDate Dates { get; set; }

        public string DropboxUrl { get; set; } // Added this line
    }

// SedaContext.cs:

public class SedaContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }

        public DbSet<Design> Designs { get; set; }
…
}


// Global.aspx
protected void Application_Start()
        {

            // Application initialize
            // https://stackoverflow.com/questions/3600175/the-model-backing-the-database-context-has-changed-since-the-database-was-crea

            Database.SetInitializer<SedaContext>(null);

في وحدة تحكم Package Manager ، عندما أقوم بتشغيل PM> Database ، يشكو من وجود بالفعل كائن يسمى "الشركات" في قاعدة البيانات."الشركات" عبارة عن جدول موجود حاليًا في قاعدة البيانات الموجودة والتي أحاول تحديثها.

أي.

PM> update-database -verbose
Using StartUp project 'UI'.
Using NuGet project 'UI'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'SedaDev' (DataSource: ., Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201405311730564_AutomaticMigration.
CREATE TABLE [dbo].[Companies] (
    [Id] [uniqueidentifier] NOT NULL DEFAULT newsequentialid(),
    [Name] [nvarchar](max),
    [Description] [nvarchar](max),
    [Owner_UserId] [int],
    CONSTRAINT [PK_dbo.Companies] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Companies' in the database.
...
   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.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:fa9e9e62-aba0-435f-9309-e9fc8fbe19d5

There is already an object named 'Companies' in the database.

المحاولة 1: بعد البحث عن هذا الخطأ، وجدت هذا الحل البديل:http://christesene.com/entity-framework-4-3-code-first-with-automatic-migrations/

أوصت بأن أركض أولاً

PM> Add-migration initial

Scaffolding migration 'initial'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration initial' again.

وقمت بإزالة الطريقة لأعلى/لأسفل:

أي.أستطيع أن أرى أن DropboxUrl كان حقلاً في الطريقة Up لكنني قمت بإزالته كما هو مقترح.

public override void Up()
        {
/*
    CreateTable(
                "dbo.Companies",
                c => new
                    {
                        Id = c.Guid(nullable: false, identity: true),
                        Name = c.String(),
                        Description = c.String(),
                        Owner_UserId = c.Int(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.UserProfiles", t => t.Owner_UserId)
                .Index(t => t.Owner_UserId);
...
  CreateTable(                "dbo.Designs",
                c => new
                    {
                        Id = c.Guid(nullable: false, identity: true),
                        Name = c.String(maxLength: 100),
                        Description = c.String(maxLength: 1000),
                        Dates_Create = c.DateTime(nullable: false),
                        Dates_LastUpdate = c.DateTime(nullable: false),
                        DropboxUrl = c.String(),
                        Project_Id = c.Guid(),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.Projects", t => t.Project_Id)
                .Index(t => t.Project_Id);
*/
        }

بعد ذلك، أقوم بتشغيل قاعدة بيانات التحديث مرة أخرى، ويبدو أنها ناجحة.

PM> update-database -verbose
Using StartUp project 'UI'.
Using NuGet project 'UI'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'SedaDev' (DataSource: phobos.spxis.com, Provider: System.Data.SqlClient, Origin: Configuration).
Applying explicit migrations: [201406020449030_initial].
Applying explicit migration: 201406020449030_initial.
INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])

VALUES (N'201406020449030_initial', N'Delecs.Seda.DataAccess.Migrations.Configuration',  0x1F8B0800000000000400ED1DCB72DCB8F19EAAFCC3D49C92544523D9F166
...
7B7C117028FAD9D8632C54E5F87C13A0D36590D83B7A73FA9F8AD368F7FFE3F0347EA807B340100 , N'6.0.2-21211')
Running Seed method

العدد 1: لم يتم تغيير طاولتي بعد التحديث (أي.لم تتم إضافة عمود DropboxUrl الموجود في التعليمات البرمجية إلى قاعدة البيانات).

العدد 2: ولم أتمكن أيضًا من إعادة قاعدة البيانات إلى حالتها الأولية:

أي.

PM> update-database -TargetMigration $InitialDatabase
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Reverting migrations: [201406020449030_initial].
Reverting automatic migration: 201406020449030_initial.
Automatic migration was not applied because it would result in data loss.
PM> update-database -TargetMigration $InitialDatabase -force
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Reverting migrations: [201406020449030_initial].
Reverting automatic migration: 201406020449030_initial.
System.Data.SqlClient.SqlException (0x80131904): Could not drop object 'dbo.UserProfiles' because it is referenced by a FOREIGN KEY constraint.

المحاولة 2: لقد حاولت أيضًا استخدام علامة -IgnoreChanges عندما أقوم بالترحيل الإضافي:الترحيل التلقائي لـ ASP.NET SimpleMembershipProvider

PM> Add-migration initial -IgnoreChanges
Re-scaffolding migration 'initial'.

PM> update-database -verbose

مرة أخرى، رأيت نفس الشيء، حيث نجح تحديث قاعدة البيانات ولكن لم تتم إضافة عمود قاعدة البيانات DropboxUrl إلى جدول التصاميم.ومع ذلك، إذا قمت بإنشاء قاعدة بيانات جديدة، فسيكون عمود DropboxUrl موجودًا كما هو متوقع.

سؤال: كيف يمكنني التغلب على وجود كائن يسمى "الشركات" بالفعل في خطأ قاعدة البيانات أثناء القيام بتحديث قاعدة البيانات، وما زلت أضيف العمود الخاص بي بنجاح؟يبدو أنه يجب أن يكون السيناريو الأساسي الذي يعمل فقط.

شكرًا.

هل كانت مفيدة؟

المحلول

عندما قمت بالتعليق على طريقتي Up() و Down() في عملية الترحيل، فقد قمت بإزالة الكود لإضافة عمود قاعدة البيانات.

يجب عليك تغيير Up() و Down() كما يلي في الحرف الأولي الخاص بك:

public override void Up() {
   AddColumn("Companies", "DropboxUrl", x => x.String());
}

public override void Down() {
    DropColumn("Companies", "DropboxUrl");
}

لكي يتمكن Entity Framework من معرفة ذلك لك في المستقبل، يتعين عليك إجراء ترحيل أولي لجعله يفهم أن هناك جدولًا موجودًا قبل إضافة الخاصية إلى الكود.على سبيل المثال Add-Migration -force -ignore.

ثم قمت بإضافة العمود وتذهب Add-Migration AddedDropboxUrlColumn, ، وسيقوم بإنشاء الطرق Up() و Down() كما شرحتها في عملية الترحيل الجديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top