มีชื่อวัตถุอยู่ในฐานข้อมูลแล้ว


115

Update-Database ล้มเหลวจาก Package Manager Console ฉันใช้ Entity Framework 6.x และวิธีการรหัสแรก ข้อผิดพลาดคือ

"มีออบเจ็กต์ชื่อ" AboutUs "อยู่ในฐานข้อมูลแล้ว"

ฉันจะแก้ปัญหานี้ได้อย่างไร?

internal sealed class Configuration 
    : DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
    {

    }
}

DbContext ของฉันคือ:

public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
    public JahanBlogDbContext()
        : base("name=JahanBlogDbConnectionString")
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<JahanBlogDbContext>());
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
    }

    public virtual DbSet<Article> Articles { get; set; }
    public virtual DbSet<ArticleLike> ArticleLikes { get; set; }
    public virtual DbSet<ArticleTag> ArticleTags { get; set; }
    public virtual DbSet<AttachmentFile> AttachmentFiles { get; set; }
    public virtual DbSet<Comment> Comments { get; set; }
    public virtual DbSet<CommentLike> CommentLikes { get; set; }
    public virtual DbSet<CommentReply> CommentReplies { get; set; }
    public virtual DbSet<ContactUs> ContactUs { get; set; }
    public virtual DbSet<Project> Projects { get; set; }
    public virtual DbSet<ProjectState> ProjectStates { get; set; }
    public virtual DbSet<ProjectTag> ProjectTags { get; set; }
    public virtual DbSet<Rating> Ratings { get; set; }
    public virtual DbSet<Tag> Tags { get; set; }
    public virtual DbSet<AboutUs> AboutUs { get; set; }
}

คอนโซลการจัดการแพ็คเกจ:

PM> update-database -verbose -force
Using StartUp project 'Jahan.Blog.Web.Mvc'.
Using NuGet project 'Jahan.Blog.Web.Mvc'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Jahan-Blog' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201410101740197_AutomaticMigration.
CREATE TABLE [dbo].[AboutUs] (
    [Id] [int] NOT NULL IDENTITY,
    [Description] [nvarchar](max),
    [IsActive] [bit] NOT NULL,
    [CreatedDate] [datetime],
    [ModifiedDate] [datetime],
    CONSTRAINT [PK_dbo.AboutUs] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AboutUs' 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, Boolean asyncWrite)
   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.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
   at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
   at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
   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, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
   at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
   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.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   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:88b66414-8776-45cd-a211-e81b2711c94b
There is already an object named 'AboutUs' in the database.
PM> 

ฉันจะทำได้อย่างไร (การจับคู่กับการออกแบบที่มีอยู่)
Roohullah Allem กล่าว

15
@HLGEM ถ้า "ฐานข้อมูลที่ออกแบบมาอย่างดี" สามารถแมปกับโมเดลอ็อบเจ็กต์โดยใช้ EF ได้มากกว่าที่ EF จะสร้างได้เช่นกัน การโอนย้ายฐานข้อมูลเป็นเครื่องมือที่มีประสิทธิภาพที่ทำให้การปรับใช้ฐานข้อมูลของคุณง่ายขึ้น ฉันไม่แนะนำให้หลีกเลี่ยงการใช้การย้ายฐานข้อมูล ไม่เช่นนั้นจำเป็นต้องมีสคริปต์แก้ไข ฉันอยากจะแนะนำให้ใช้การย้ายฐานข้อมูลอย่างถูกต้อง
Ilya Palkin

คำตอบ:


129

ดูเหมือนว่ามีปัญหาในกระบวนการย้ายข้อมูลให้เรียกใช้คำสั่ง add-migration ใน "Package Manager Console":

Add-Migration Initial -IgnoreChanges

ทำการเปลี่ยนแปลงบางอย่างจากนั้นอัปเดตฐานข้อมูลจากไฟล์ "Initial":

อัปเดตฐานข้อมูล -verbose

แก้ไข: -IgnoreChanges อยู่ใน EF6 แต่ไม่ใช่ใน EF Core นี่คือวิธีแก้ปัญหา: https://stackoverflow.com/a/43687656/495455


8
สิ่งนี้ทำอะไรกันแน่? สิ่งนี้อนุญาตให้โมเดลใหม่เพียงแค่เขียนทับรุ่นเก่าหรือไม่
Travis Tubbs

1
ฉันเริ่มใช้การย้ายข้อมูลด้วยตนเองเพราะฉันใช้มุมมองและตารางในฐานข้อมูลของฉัน ฉันทำผิดพลาดในการพยายามใช้การย้ายข้อมูลอัตโนมัติและด้วยเหตุนี้จึงพยายามสร้างตารางจากมุมมอง ในสถานการณ์นี้โซลูชันของคุณใช้ไม่ได้ฉันควรใช้การย้ายข้อมูลด้วยตนเองแทน หลังจากทำสิ่งนี้ฉันต้องยกเลิกการเปลี่ยนแปลงในตัวควบคุมแหล่งที่มาและลบรายการ "เริ่มต้น" ออกจากตาราง _Migrations
arame3333

3
สิ่งนี้ทำให้ฉันวนซ้ำไม่สิ้นสุด: Package Manager Console ไม่ยอมให้ฉันทำการ Add-Migration เนื่องจากมีข้อผิดพลาด "ไม่สามารถสร้างการย้ายข้อมูลอย่างชัดเจนเนื่องจากการย้ายข้อมูลอย่างชัดเจนต่อไปนี้กำลังรอดำเนินการ ... " คือ InitialCreate แต่ถ้าฉันไม่สามารถเรียกใช้ Update-Database ได้สำเร็จ UNTIL ก็มี Initial -IgnoreChanges อยู่ด้วยฉันควรทำอย่างไร ??
East of Nowhere

6
Add-Migration: ไม่พบพารามิเตอร์ที่ตรงกับชื่อพารามิเตอร์ "IgnoreChanges"
Tzvi Gregory Kaidanov

3
@TravisTubbs สิ่งนี้จะไม่สนใจการเปลี่ยนแปลงที่คุณทำและ "ของปลอม" ที่โมเดลของคุณซิงค์กับฐานข้อมูลในส่วนที่เกี่ยวกับตารางการย้ายข้อมูล คุณยังต้องซิงค์ทั้งสองด้วยตนเอง ในกรณีของฉันฉันลบการเปลี่ยนแปลงที่เกิดขึ้นกับโมเดลทำ Add-Migration ลบเนื้อหาออกจากเมธอดขึ้น / ลงก่อนที่จะทำการอัพเดตฐานข้อมูล - สิ่งนี้ทำให้ฉันกลับสู่สถานะก่อนที่จะมีการโอนย้ายแบบหมดสภาพ จากนั้นฉันก็เพิ่มการเปลี่ยนแปลงใหม่เพิ่มการโยกย้ายและอัปเดตฐานข้อมูลตามปกติ - คราวนี้ทุกอย่างซิงค์
David Refaeli

73

บางทีคุณอาจเปลี่ยนเนมสเปซในโครงการของคุณ! มีตารางในฐานข้อมูลของคุณเรียกว่าเป็น
ตารางมีคอลัมน์ที่เรียกว่าdbo.__MigrationHistory ค่าของคอลัมน์นี้ขึ้นอยู่กับไฟล์. ตัวอย่างเช่น " " เมื่อคุณเปลี่ยนเนมสเปซจะทำให้ชื่อตารางซ้ำกับเนมสเปซต่างกัน ดังนั้นหลังจากที่คุณเปลี่ยนเนมสเปซในฝั่งโค้ดแล้วให้เปลี่ยนเนมสเปซในตารางนี้ในฐานข้อมูลด้วย (สำหรับทุกแถว) ตัวอย่างเช่นหากคุณเปลี่ยนเนมสเปซเป็นคุณควรเปลี่ยนค่าของคอลัมน์เป็น " " จากนั้นในด้านโค้ดใน Tools => Package Manager Console ให้ใช้คำสั่งContextKey
namespaceDataAccess.Migrations.Configuration


EFDataAccessContextKeydbo.__MigrationHistoryEFDataAccess.Migrations.Configuration
update-database

อีกทางเลือกหนึ่งแทนการเปลี่ยนค่าบริบทในฐานข้อมูลคือการฮาร์ดโค้ดค่าบริบทในโค้ดของคุณเป็นค่าเนมสเปซเก่า สิ่งนี้เป็นไปได้โดยการสืบทอดDbMigrationsConfiguration<YourDbContext>และในตัวสร้างเพียงแค่กำหนดค่าบริบทเก่าให้ContextKeyมากกว่าสืบทอดจากMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>และปล่อยให้คลาสนั้นว่างเปล่า สิ่งสุดท้ายที่ต้องทำคือเรียกDatabase.SetInitializer(new YourDbInitializer());DbContext ของคุณในตัวสร้างแบบคงที่

ฉันหวังว่าปัญหาของคุณจะได้รับการแก้ไข


9
เยี่ยมมากเรามีปัญหานี้!
Olivier ROMAND

3
อันที่จริงนี่คือสาเหตุที่แท้จริงของข้อผิดพลาดนี้ EF พยายามสร้างฐานข้อมูลเนื่องจากไม่สามารถอ่านได้ว่าการย้ายข้อมูลใดที่ใช้กับฐานข้อมูลเนื่องจากใช้ความแตกต่างของ nameSpace
UfukSURMEN

ขอบคุณคำตอบนี้ช่วยฉันได้มากอย่างที่ Olivier ROMAND กล่าวว่าฉันมีปัญหานี้!
Enrique A.Pinelo Novelo

ฉันไม่รู้ว่ามันเกี่ยวข้องกับสิ่งนี้ แต่อย่างใดแม้กระทั่งการลบบันทึกของMigrationHistoryตารางก็ไม่ได้แก้ไขให้ฉัน ... ดังนั้นฉันจึงทิ้งตารางทั้งหมดของฉันและปล่อยให้ EF สร้างทั้งหมดขึ้นมาใหม่อีกครั้งแอปขนาดเล็กไม่มีปัญหาใหญ่ .. แต่มันแก้ไขให้ฉัน
Niklas

นี่คือคำตอบที่ถูกต้องพร้อมรายละเอียดนอกจากนี้ยังควรระบุด้วยว่าบางครั้งการสะกดชื่อโฟลเดอร์ที่สะกดผิดจะทำให้เกิดปัญหานี้
H35am

17

"มีออบเจ็กต์ชื่อ" AboutUs "อยู่ในฐานข้อมูลแล้ว"

ข้อยกเว้นนี้จะบอกคุณว่ามีคนเพิ่มวัตถุชื่อ 'AboutUs' ลงในฐานข้อมูลแล้ว

AutomaticMigrationsEnabled = true;สามารถนำไปสู่ได้เนื่องจากคุณไม่ได้ควบคุมเวอร์ชันฐานข้อมูลในกรณีนี้ เพื่อหลีกเลี่ยงการโยกย้ายคาดเดาไม่ได้และให้แน่ใจว่านักพัฒนาทุกคนในทีมทำงานร่วมกับโครงสร้างฐานข้อมูลเดียวกันผมขอแนะนำให้คุณตั้งค่าAutomaticMigrationsEnabled = false;

การย้ายข้อมูลอัตโนมัติและการย้ายรหัสสามารถใช้ควบคู่กันไปได้หากคุณระมัดระวังและเป็นนักพัฒนาเพียงคนเดียวในโครงการ

มีคำพูดจาก Automatic Code First Migrations ที่โพสต์บน Data Developer Center :

การโอนย้ายอัตโนมัติช่วยให้คุณใช้ Code First Migrations โดยไม่ต้องมีไฟล์โค้ดในโปรเจ็กต์ของคุณสำหรับการเปลี่ยนแปลงแต่ละครั้งที่คุณทำ ไม่สามารถใช้การเปลี่ยนแปลงทั้งหมดโดยอัตโนมัติตัวอย่างเช่นการเปลี่ยนชื่อคอลัมน์จำเป็นต้องใช้การย้ายข้อมูลโดยใช้รหัส

คำแนะนำสำหรับสภาพแวดล้อมของทีม

คุณสามารถสลับการย้ายข้อมูลอัตโนมัติและแบบใช้รหัสได้ แต่ไม่แนะนำให้ใช้ในสถานการณ์การพัฒนาทีม หากคุณเป็นส่วนหนึ่งของทีมนักพัฒนาที่ใช้การควบคุมแหล่งที่มาคุณควรใช้การย้ายข้อมูลอัตโนมัติทั้งหมดหรือการย้ายโดยใช้รหัสทั้งหมด เมื่อพิจารณาถึงข้อ จำกัด ของการย้ายข้อมูลอัตโนมัติเราขอแนะนำให้ใช้การย้ายโดยใช้รหัสในสภาพแวดล้อมของทีม


12

ในกรณีของฉันEFMigrationsHistoryตารางของฉันว่างเปล่า (อย่างใด) และเมื่อพยายามเรียกใช้update-databaseฉันจะได้รับ:

มีวัตถุชื่อ 'AspNetUsers' อยู่ในฐานข้อมูลแล้ว

หลังจากที่เห็นตารางถูกล้างออกแล้วมันทำให้รู้สึกได้ว่ากำลังพยายามเรียกใช้การย้ายข้อมูลครั้งแรกอีกครั้งและพยายามสร้างตารางขึ้นมาใหม่

เพื่อแก้ไขปัญหานี้ฉันได้เพิ่มแถวลงในEFMigrationsHistoryตารางของฉัน 1 แถวสำหรับการย้ายข้อมูลแต่ละครั้งที่ฉันรู้ว่าฐานข้อมูลเป็นข้อมูลล่าสุด

แถวจะมี 2 คอลัมน์: MigrationIdและProductVersion

MigrationIdคือชื่อไฟล์การย้ายข้อมูลของคุณ ตัวอย่าง:20170628112345_Initial

ProductVersionคือเวอร์ชัน ef ที่คุณใช้งานอยู่ คุณสามารถค้นหาสิ่งนี้ได้โดยพิมพ์Get-Packageลงใน Package Manager Console และมองหาแพ็คเกจ ef ของคุณ

หวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน


1
คุณเติมข้อมูลในคอลัมน์ Model ได้อย่างไร
Ciaran Gallagher

7

ในกรณีของฉันฉันได้ตั้งชื่อแอสเซมบลีใหม่ที่มีโมเดลเฟรมเวิร์กเอนทิตีรหัสแรก แม้ว่าสคีมาจริงจะไม่เปลี่ยนแปลงในตารางการย้ายทั้งหมดที่เรียก

dbo.__MigrationHistory

มีรายการของการโอนย้ายที่ดำเนินการไปแล้วตามชื่อแอสเซมบลีเก่า ฉันอัปเดตชื่อเก่าในตารางการย้ายข้อมูลให้ตรงกับชื่อใหม่และจากนั้นการย้ายข้อมูลก็ใช้งานได้อีกครั้ง


5

ตรวจสอบให้แน่ใจว่าโครงการเริ่มต้นโซลูชันของคุณมีสตริงการเชื่อมต่อที่ถูกต้องในไฟล์กำหนดค่า หรือตั้งค่าพารามิเตอร์ -StartUpProjectName เมื่อเรียกใช้คำสั่ง update-database พารามิเตอร์ -StartUpProjectName ระบุไฟล์คอนฟิกูเรชันที่จะใช้สำหรับสตริงการเชื่อมต่อที่ระบุชื่อ หากละเว้นไฟล์คอนฟิกูเรชันของโปรเจ็กต์ที่ระบุจะถูกใช้

นี่คือลิงค์สำหรับการอ้างอิงคำสั่ง ef-migration http://coding.abel.nu/2012/03/ef-migrations-command-reference/


คำตอบนี้ทำให้ฉันผิดพลาดฉันมีโปรเจ็กต์ที่ไม่ถูกต้องเป็นโปรเจ็กต์เริ่มต้น
Martin Johansson

ฉันมีปัญหาที่คล้ายกันและสิ่งนี้ได้รับการแก้ไขให้ฉัน
JordanTDN

3

ฉันมีปัญหาเดียวกันและหลังจากสามชั่วโมงที่ดิ้นรนฉันก็พบว่าเกิดอะไรขึ้น

ในกรณีของฉันเมื่อฉันต้องการย้ายข้อมูลเป็นครั้งแรกในup()วิธีการรหัสเริ่มต้นต้องการสร้างตารางที่มีอยู่แล้วดังนั้นฉันจึงได้รับข้อผิดพลาดเช่นเดียวกับคุณ

ในการแก้ปัญหาเพียงแค่ลบโค้ดเหล่านั้นและเขียนตามที่คุณต้องการ ตัวอย่างเช่นฉันต้องการเพิ่มคอลัมน์ดังนั้นฉันจึงเขียน

migrationBuilder.AddColumn<string>(
            name: "fieldName",
            table: "tableName",
            nullable: true);

ดูเหมือนจะเป็นคำตอบที่ดี แต่คุณอาจต้องการตรวจสอบตัวสะกด คุณยังสามารถใช้ข้อมูลโค้ดเพื่อทำให้ชัดเจนว่าบรรทัดสุดท้ายคือโค้ด ส่งข้อความถึงฉันหากคุณต้องการความช่วยเหลือในเรื่องนี้
Mike Poole

ขอบคุณฉันจะนวดคุณได้อย่างไร
arfa

1
ทำได้ดีมากสำหรับการเพิ่มข้อมูลโค้ด @arfa ไม่ต้องนวด :). หากคุณต้องการส่งข้อความถึงฉันเพียงแค่พิมพ์@ตามด้วยชื่อผู้ใช้ของฉันในส่วนความคิดเห็น
Mike Poole

3

หมายเหตุ: ไม่แนะนำวิธีแก้ปัญหา แต่แก้ไขอย่างรวดเร็วในบางกรณี

สำหรับฉันdbo._MigrationHistoryในฐานข้อมูลการผลิตพลาดบันทึกการโยกย้ายระหว่างขั้นตอนการเผยแพร่ แต่ฐานข้อมูลการพัฒนามีบันทึกการย้ายข้อมูลทั้งหมด

หากคุณแน่ใจว่าฐานข้อมูลที่ใช้งานจริงมีสคีมาที่เหมือนกันและใหม่ที่สุดเมื่อเทียบกับ dev db การคัดลอกบันทึกการย้ายข้อมูลทั้งหมดไปยังฐานข้อมูลการผลิตสามารถแก้ไขปัญหาได้

คุณสามารถทำได้ด้วย VisualStudio แต่เพียงผู้เดียว

  1. เปิดแผง 'SQL Server Object Explorer'> คลิกขวาที่dbo._MigrationHistoryตารางในฐานข้อมูลต้นทาง (ในกรณีของฉัน dev db)> คลิกเมนู "การเปรียบเทียบข้อมูล ... "
  2. จากนั้นตัวช่วยสร้างการเปรียบเทียบข้อมูลจะปรากฏขึ้นเลือกฐานข้อมูลเป้าหมาย (ในกรณีของฉันฐานข้อมูลการผลิต) และคลิกถัดไป
  3. ไม่กี่วินาทีต่อมาจะแสดงบางระเบียนในฐานข้อมูลต้นทางเท่านั้น เพียงคลิกปุ่ม 'อัปเดตเป้าหมาย'
  4. ในเบราว์เซอร์ให้กดปุ่มรีเฟรชและเห็นข้อความแสดงข้อผิดพลาดหายไป

โปรดทราบว่าอีกครั้งไม่แนะนำให้ใช้ในโครงการที่ซับซ้อนและจริงจัง ใช้สิ่งนี้เฉพาะคุณที่มีปัญหาในระหว่างการเรียนรู้ ASP.Net หรือ EntityFramework


1
สิ่งนี้ได้ผลสำหรับฉัน มันเป็นวิธีอื่น ๆ แม้ว่า ฐานข้อมูลการผลิตของฉันมีเร็กคอร์ดทั้งหมดใน __EFMigrationHistory ในขณะที่ข้อมูลเหล่านั้นใน dev db ที่หายไปอย่างใด (ยกเว้นค่าเริ่มต้น)
Jens Mander

1

ลบแถวจากตาราง dbo_MigrationHistory หรือลบตารางแล้วเรียกใช้

update-database -verbose

จะเรียกใช้การย้ายข้อมูลทั้งหมดในโครงการของคุณทีละรายการ


1

ในกรณีของฉันปัญหาอยู่ใน Seeder ฉันกำลังเรียกใช้ _ctx.Database.EnsureCreated () อยู่ข้างในและเท่าที่ฉันเข้าใจคำสั่ง update database ได้ดำเนินการสำเร็จแล้ว แต่ seeder พยายามสร้างฐานข้อมูลครั้งที่สอง

วิธีที่อยู่:

  1. ทำการอัปเดตการทำงานของถั่วเพียงแค่เริ่มแอปพลิเคชันและเรียกใช้ SureCreated () ฐานข้อมูลจะถูกสร้าง / ปรับปรุง
  2. แสดงความคิดเห็นหรือลบ seeder

1

อีกหนึ่งสถานการณ์ EF Core แบบ edge-case

ตรวจสอบว่าคุณมีไฟล์Migrations / YOURNAMEContextModelSnapshot.cs

ตามรายละเอียดใน - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

หากคุณพยายามสร้างฐานข้อมูลของคุณใหม่ด้วยตนเองโดยการลบไฟล์ migration.cs โปรดระวังว่าไฟล์ Migrations / * ContextModelSnapshot.cs ของคุณยังคงมีอยู่

หากไม่มีการย้ายข้อมูลครั้งต่อ ๆ ไปของคุณจะไม่มีสแนปชอตสำหรับสร้างความแตกต่างที่ต้องการและไฟล์การย้ายข้อมูลใหม่ของคุณจะดูเหมือนว่ากำลังสร้างทุกอย่างขึ้นมาใหม่ตั้งแต่ต้นจากนั้นคุณจะได้รับข้อผิดพลาดของตารางที่มีอยู่ดังที่กล่าวมา


1

เกิดขึ้นกับฉัน .. ปัญหาคือจริงๆแล้วฉันลบตารางฐานข้อมูลของฉันMoviesCastและสร้างตารางใหม่และปัญหาคือการย้ายครั้งล่าสุดของฉันพยายามทำให้ตารางที่ถูกลบMoviesCastในฐานข้อมูล ฉันแก้ไขได้โดยเพียงแค่ลบเนื้อหาทั้งหมดของการย้ายข้อมูลครั้งล่าสุดและใช้เมธอด Up () & down ()

public override void Up()
{
}

public override void Down()
{
}

จากนั้นอัปเดตฐานข้อมูลและเพิ่มการย้ายข้อมูลใหม่


1

ฉันมีปัญหาเดียวกันกับที่อธิบายไว้ในคำตอบที่ Elnaz ให้ ฉันมีความต้องการที่จะเปลี่ยนเนมสเปซของดาต้าเลเยอร์ระหว่างการปรับโครงสร้างใหม่ของโปรเจ็กต์ของเรา สิ่งนี้ทำให้การย้ายข้อมูลไม่เห็นการย้ายข้อมูลที่มีอยู่ในฐานข้อมูล ฉันพบคำตอบที่ยอดเยี่ยมสำหรับปัญหานี้ที่ James Chambers บล็อกไว้

http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

ฉันเพิ่งเปลี่ยนสิ่งต่อไปนี้ในไฟล์กำหนดค่าการย้ายข้อมูล

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    this.ContextKey = Old_Namespace.Migrations.Configuration”;
}

หวังว่านี่จะช่วยคนอื่นได้


ฉันมีสถานการณ์ที่คล้ายกันหลังจากเปลี่ยนเนมสเปซ ลองแก้ไขแล้ว แต่ยังไม่ได้ผล ดังนั้นฉันจึงแก้ไขเนมสเปซด้วยตนเองในตารางฐานข้อมูลแล้วมันก็เริ่มทำงาน
kosist

0

เพียงดำเนินการคำสั่ง update-migration -Script สิ่งนี้จะสร้างสคริปต์ * .sql ใหม่ซึ่งรวมถึงการเปลี่ยนแปลง DB ทั้งหมดที่รวมอยู่ในการโอนย้าย ในส่วนท้ายของโค้ดจะมีคำสั่งแทรกดังนี้: INSERT [dbo] [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]) คุณสามารถเรียกใช้ INSERT ทั้งหมดและ DB จะซิงโครไนซ์


0

หลังจากไม่ได้รับผลลัพธ์นานกว่าหนึ่งชั่วโมงฉันลองใช้วิธีอื่นโดยไม่ใช้การย้ายข้อมูล แต่ฉันได้เปรียบเทียบสคีมา

ใน Visual Studio -> Tools -> SQL Server -> การเปรียบเทียบ Schema ใหม่

ก่อนอื่นฉันสร้างฐานข้อมูลใหม่ทั้งหมดด้วยการย้ายข้อมูล EF กว่าที่ฉันจะทำการเปรียบเทียบเปรียบเทียบฐานข้อมูลใหม่กับฐานข้อมูลที่ฉันต้องการอัปเดต ในที่สุดก็สร้างสคริปต์การย้ายข้อมูลและฉันสามารถทำการอัปเดตสคีมาได้


0

ในกรณีของฉัน (ต้องการรีเซ็ตและรับฐานข้อมูลใหม่)

ก่อนอื่นฉันได้รับข้อความแสดงข้อผิดพลาด: There is already an object named 'TABLENAME' in the database.

และฉันเห็นก่อนหน้านี้เล็กน้อย:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

ฐานข้อมูลของฉันถูกสร้างขึ้น แต่ไม่มีบันทึกในประวัติการย้ายข้อมูล

ฉันวางตารางทั้งหมดยกเว้น dbo .__ MigrationsHistory

MigrationsHistory ว่างเปล่า

วิ่ง dotnet ef database update -c StudyContext --verbose

(- ใช้คำกริยาเพื่อความสนุกสนาน)

และได้ Done.


0

ฉันประสบกับข้อผิดพลาดเดียวกันกับด้านล่าง จากนั้นฉันแก้ไขดังต่อไปนี้:

  1. ตรวจสอบฐานข้อมูลปัจจุบันในโครงการของคุณ:
    • dotnet ef migrations list
  2. หากใหม่ล่าสุดคือสิ่งที่คุณเพิ่มให้ลบออก:
    • dotnet ef migrations remove
  3. เอาต์พุตการรับประกันของฐานข้อมูลนี้ต้องแยกออกในไฟล์ซอร์สโค้ด: .cs / .Designer.cs

4. ตอนนี้สบายดี ลองเพิ่มใหม่: dotnet ef migrations add [new_dbo_name]

5. สุดท้ายลองอัปเดตอีกครั้งตามการจัดเรียงตามรายการการย้ายข้อมูล:

  • dotnet ef database update [First]
  • dotnet ef database update [Second]
  • ...
  • dotnet ef database update [new_dbo_name]

หวังว่าจะเป็นประโยชน์สำหรับคุณ ^^


0

คุณได้ลบโฟลเดอร์การย้ายข้อมูลไปแล้วกว่าที่คุณพยายามเรียกใช้คำสั่ง "update-database" บนคอนโซลตัวจัดการแพ็คเกจใช่หรือไม่ ถ้าเป็นเช่นนั้น

เพียงแค่ลบตารางทั้งหมดของคุณด้วยตนเองกว่าจะรันถ้า update-databse (ข้อมูล seed ข้อเสียจะถูกลบ)


0

อีกวิธีในการทำเช่นนั้นคือแสดงความคิดเห็นทุกอย่างใน Initial Class ระหว่างวิธีการขึ้นและลงจากนั้นเรียกใช้ฐานข้อมูลการอัปเดตหลังจากเรียกใช้วิธีการ seed สำเร็จแล้วให้เรียกใช้ฐานข้อมูลการอัปเดตอีกครั้งอาจเป็นประโยชน์สำหรับเพื่อน ๆ บางคน


0

ฉันประสบปัญหาเดียวกัน ฉันลองวิธีแก้ปัญหาด้านล่าง: 1. ลบสร้างรหัสตารางจาก Up () และรหัสที่เกี่ยวข้องจากวิธี Down () 2. เรียกใช้คำสั่ง update-database ใน Package Manager Consol

สิ่งนี้ช่วยแก้ปัญหาของฉันได้


0

หมายเหตุ: ฉันทำไปเพราะไม่มีอะไรในฐานข้อมูล ในกรณีของฉัน: 1. ฉันลบการย้ายโดยคำสั่งremove-migrationในPackage Manager Console 2. ลบฐานข้อมูลโดยพาเนล 'SQL Server Object Explorer'> บนฐานข้อมูลปัจจุบัน> คลิกขวา> ลบ 3. ย้ายข้อมูลในPackage Manager Console แล้วเขียนเพิ่ม -Migrationแล้วคลิก Enter 4. อัพเดตล่าสุดโดย command update-database


0

กรณีเดียวกัน (ไม่มีตาราง DB และ MigrationHistory บนเซิร์ฟเวอร์) ขั้นตอนของฉัน:

  1. ฉันลบข้อมูลการย้ายข้อมูลจากส่วนขึ้นและลงของการย้ายข้อมูลครั้งแรก
  2. อัปเดตฐานข้อมูลด้วยการย้ายข้อมูลที่ว่างเปล่า (สร้างตาราง MigrationHistory)
  3. เพิ่มการโยกย้ายจริงของคุณและอัปเดตฐานข้อมูลด้วย

0

ในฐานข้อมูลให้ค้นหาตาราง __MigrationHistory และคัดลอก [ContextKey]

วางลงใน DbMigrationsConfiguration ConextKey ดังต่อไปนี้

internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
    {
        public DbConfiguration()
        {
            AutomaticMigrationsEnabled = true;
            ContextKey = "<contextKey from above>";
        }

0

ขั้นตอนด้านล่างใช้ได้ผลสำหรับฉันสำหรับปัญหาเดียวกัน:

สถานการณ์:

ฉันพยายามเพิ่ม 2 ฟิลด์ใหม่ในโมเดลที่มีอยู่สำหรับฟังก์ชันอีเมล ช่องใหม่คือ "IsEmailVerified" และ "ActivationCode"

ขั้นตอนที่ฉันทำตาม:

1. ลบไฟล์การย้ายข้อมูลเก่าภายใต้โฟลเดอร์ "การย้ายข้อมูล" ซึ่งทำให้ฉันไม่สามารถอัปเดตฐานข้อมูล 2. ย้อนกลับการเปลี่ยนแปลงล่าสุดทั้งหมดที่ฉันทำในโมเดล

3. เรียกใช้คำสั่งด้านล่าง:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = **** "

4. ลบเนื้อหาจากวิธีการขึ้น () และลง () จากไฟล์การย้ายข้อมูลและปล่อยให้เมธอดว่างเปล่า

5. เรียกใช้คำสั่งด้านล่าง:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. หลังจากดำเนินการตามขั้นตอนข้างต้นโมเดลและฐานข้อมูลจะมีการซิงค์

  2. ตอนนี้ฉันได้เพิ่มคุณสมบัติใหม่ในแบบจำลอง

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. เรียกใช้คำสั่งด้านล่าง:

Add-Migration -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

  1. ตอนนี้ไฟล์การย้ายข้อมูลมีเฉพาะการเปลี่ยนแปลงล่าสุดของฉันดังต่อไปนี้:

       public override void Up()
         {
             AddColumn("dbo.UserAccounts", "IsEmailVerified", c => c.Boolean(nullable: false));
             AddColumn("dbo.UserAccounts", "ActivationCode", c => c.Guid(nullable: false));
         }        
         public override void Down()
         {
             DropColumn("dbo.UserAccounts", "ActivationCode");
             DropColumn("dbo.UserAccounts", "IsEmailVerified");
         }
  2. เรียกใช้คำสั่งด้านล่าง: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

11. ตอนนี้ฉันอัปเดตฐานข้อมูลด้วยคอลัมน์เพิ่มเติมสำเร็จแล้ว

ด้านล่างนี้เป็นตารางที่อัปเดตหลังจากการเปลี่ยนแปลงล่าสุด:

ตารางหลังการย้ายการอัปเดต


ไม่แนะนำสิ่งนี้จริงๆการลบการย้ายข้อมูลผลิตภัณฑ์จะทำลายสิ่งแวดล้อมของคุณ ทำไมคุณต้องลบการย้ายข้อมูลของคุณถ้าพวกเขาทำงานจนถึงตอนนี้? และสตริงการเชื่อมต่อของคุณจะไม่ทำงานสำหรับผู้ใช้ทุกคนที่นี่ไม่ควรเรียกใช้แบบนั้น
rakuens

-5

ในแฟ้มการโยกย้ายตรวจสอบแทนที่โมฆะสาธารณะขึ้น ()วิธีการ อาจเป็นคุณกำลังพยายามสร้างวัตถุ db ใหม่ที่มีอยู่แล้วในฐานข้อมูล ดังนั้นคุณต้องวางวัตถุ / ตารางนี้ก่อนที่จะสร้างวัตถุ db แค่ทำเหมือนร้อง -

DropTable("dbo.ABC"); 
CreateTable(
            "dbo.ABC",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ..
                 }

ตอนนี้เรียกใช้การย้ายข้อมูลของคุณ Update-Database -TargetMigration: "2016_YourMigration"


6
หากคุณทำเช่นนี้คุณจะสูญเสียข้อมูลทั้งหมดของคุณ
Mehdiway
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.