Đã có một đối tượng có tên trong cơ sở dữ liệu


115

Cập nhật-Cơ sở dữ liệu không thành công từ Bảng điều khiển Trình quản lý Gói. Tôi đã sử dụng Entity Framework 6.x và cách tiếp cận mã đầu tiên. Lỗi là

"Đã có một đối tượng có tên 'AboutUs' trong cơ sở dữ liệu."

Làm thế nào tôi có thể giải quyết vấn đề này?

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 của tôi là:

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

Bảng điều khiển quản lý gói:

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> 

Làm thế nào tôi có thể làm điều đó (ánh xạ đến thiết kế hiện có)?
Roohullah Allem nói vào

15
@HLGEM, Nếu "cơ sở dữ liệu được thiết kế tốt" có thể được ánh xạ tới một mô hình đối tượng bằng EF thì EF cũng có thể tạo ra nó. Di chuyển DB là một công cụ mạnh mẽ giúp triển khai cơ sở dữ liệu của bạn dễ dàng hơn. Tôi không khuyên bạn nên tránh sử dụng di chuyển DB. Nếu không thì vẫn cần các tập lệnh vá. Tôi khuyên bạn nên sử dụng quyền di chuyển DB.
Ilya Palkin

Câu trả lời:


129

Có vẻ như có sự cố trong quá trình di chuyển, hãy chạy lệnh bổ sung di chuyển trong "Bảng điều khiển Trình quản lý Gói":

Bổ sung di chuyển ban đầu -IgnoreChanges

thực hiện một số thay đổi, sau đó cập nhật cơ sở dữ liệu từ tệp "Ban đầu":

Cập nhật-Cơ sở dữ liệu -verbose

Chỉnh sửa: -IgnoreChanges có trong EF6 nhưng không có trong EF Core, đây là cách giải quyết: https://stackoverflow.com/a/43687656/495455


8
Điều này chính xác làm gì? Điều này có cho phép mô hình mới chỉ ghi đè lên mô hình cũ không?
Travis Tubbs

1
Tôi bắt đầu sử dụng di chuyển thủ công vì tôi sử dụng Chế độ xem cũng như Bảng trong cơ sở dữ liệu của mình. Tôi đã mắc lỗi khi cố gắng sử dụng tính năng di chuyển tự động và kết quả là nó đang cố gắng tạo một bảng từ một chế độ xem. Trong trường hợp này, giải pháp của bạn không hoạt động, thay vào đó, tôi nên luôn sử dụng di chuyển thủ công. Vì vậy, sau khi thực hiện việc này, tôi phải hoàn tác các thay đổi trong kiểm soát nguồn và xóa mục nhập "Ban đầu" khỏi bảng _Migrations.
arame3333

3
Điều này chỉ dẫn tôi đến một vòng lặp vô hạn: Bảng điều khiển Trình quản lý gói sẽ không cho phép tôi thực hiện Add-Migration vì nó đưa ra lỗi "Không thể tạo một quá trình di chuyển rõ ràng vì các lần di chuyển rõ ràng sau đang chờ xử lý ..." cụ thể là InitialCreate. Nhưng nếu tôi không thể chạy thành công Cập nhật-Cơ sở dữ liệu đó cho đến khi cũng có một số thay đổi-tiên lượng ban đầu, thì tôi phải làm gì ??
East of Nowhere

6
Add-Migration: Không thể tìm thấy thông số phù hợp với tên thông số 'Bỏ qua thay đổi'.
Tzvi Gregory Kaidanov

3
@TravisTubbs điều này bỏ qua những thay đổi bạn đã thực hiện và "ngụy tạo" rằng mô hình của bạn được đồng bộ hóa với db, liên quan đến bảng di chuyển. Bạn vẫn cần phải đồng bộ hóa cả hai theo cách thủ công; Trong trường hợp của tôi, tôi đã xóa các thay đổi được thực hiện đối với mô hình, đã thực hiện Di chuyển bổ sung, xóa nội dung khỏi các phương thức lên / xuống trước khi thực hiện cập nhật cơ sở dữ liệu - điều này đã đưa tôi trở lại trạng thái trước khi di chuyển vi phạm. Sau đó, tôi thực sự lại thêm những thay đổi, đã add-di cư, và cập nhật cơ sở dữ liệu như bình thường - thời gian này tất cả mọi thứ được đồng bộ hóa
David Refaeli

73

Có thể bạn đã thay đổi không gian tên trong dự án của mình!
Có một bảng trong cơ sở dữ liệu của bạn được gọi dbo.__MigrationHistory. Bảng có một cột được gọi ContextKey.
Giá trị của cột này được dựa trên của bạn namespace. ví dụ là " DataAccess.Migrations.Configuration".
Khi bạn thay đổi vùng tên, nó gây ra các tên bảng trùng lặp với các vùng tên khác nhau.
Vì vậy, sau khi bạn thay đổi không gian tên trong phía mã, hãy thay đổi không gian tên trong bảng này trong cơ sở dữ liệu, (cho tất cả các hàng).
Ví dụ: nếu bạn thay đổi không gian tên thành EFDataAccess, thì bạn nên thay đổi các giá trị của ContextKeycột trong dbo.__MigrationHistorythành " EFDataAccess.Migrations.Configuration".
Sau đó, trong phần mã, trong Công cụ => Bảng điều khiển Trình quản lý Gói, hãy sử dụng update-databaselệnh.

Một tùy chọn khác thay vì thay đổi giá trị ngữ cảnh trong cơ sở dữ liệu là mã hóa giá trị ngữ cảnh trong mã của bạn thành giá trị không gian tên cũ. Điều này có thể do thừa kế DbMigrationsConfiguration<YourDbContext>và các nhà xây dựng chỉ gán giá trị bối cảnh cũ để ContextKey, hơn kế thừa từ MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>và để lại lớp đó có sản phẩm nào. Điều cuối cùng cần làm là gọi Database.SetInitializer(new YourDbInitializer());DbContext của bạn trong một hàm tạo tĩnh.

Tôi hy vọng vấn đề của bạn sẽ được khắc phục.


9
Tuyệt vời, chúng tôi đã gặp chính xác vấn đề này!
Olivier ROMAND

3
Trên thực tế đây là nguyên nhân thực sự của lỗi này. EF đang cố gắng để tạo ra cơ sở dữ liệu như Nó không thể đọc mà di cư có thể được áp dụng cho cơ sở dữ liệu becuse của namespace khác biệt
UfukSURMEN

Cảm ơn câu trả lời này, đã giúp tôi rất nhiều, như Olivier ROMAND đã nói, tôi gặp chính xác vấn đề này!
Enrique A. Pinelo Novelo

Tôi không biết nó liên quan đến điều này, nhưng bằng cách nào đó, ngay cả việc xóa các bản ghi của MigrationHistorybảng cũng không khắc phục được cho tôi ... vì vậy tôi đã bỏ tất cả các bảng của mình và để EF tạo lại tất cả chúng, ứng dụng nhỏ, không có vấn đề gì. ..nhưng nó đã sửa nó cho tôi.
Niklas

Đây là câu trả lời chính xác với các chi tiết, cũng tốt để đề cập rằng đôi khi tên thư mục sai chính tả sẽ gây ra vấn đề này.
H35 sáng

17

"Đã có một đối tượng có tên 'AboutUs' trong cơ sở dữ liệu."

Ngoại lệ này cho bạn biết rằng ai đó đã thêm một đối tượng có tên là 'AboutUs' vào cơ sở dữ liệu.

AutomaticMigrationsEnabled = true;có thể dẫn đến nó vì các phiên bản cơ sở dữ liệu không do bạn kiểm soát trong trường hợp này. Để tránh di chuyển không thể đoán trước và đảm bảo rằng mọi nhà phát triển trong nhóm làm việc với cùng một cấu trúc cơ sở dữ liệu, tôi đề nghị bạn đặtAutomaticMigrationsEnabled = false; .

Di chuyển tự động và di chuyển được mã hóa có thể tồn tại song song nếu bạn rất cẩn thận và là nhà phát triển duy nhất trong một dự án.

Có một trích dẫn từ bài đăng Tự động chuyển đổi mã đầu tiên trên Trung tâm nhà phát triển dữ liệu :

Di chuyển tự động cho phép bạn sử dụng Code First Migrations mà không cần có tệp mã trong dự án của bạn cho mỗi thay đổi bạn thực hiện. Không phải tất cả các thay đổi đều có thể được áp dụng tự động - ví dụ: đổi tên cột yêu cầu sử dụng di chuyển dựa trên mã.

Đề xuất cho Môi trường nhóm

Bạn có thể xen kẽ di chuyển tự động và dựa trên mã nhưng điều này không được khuyến nghị trong các tình huống phát triển nhóm. Nếu bạn là một phần của nhóm các nhà phát triển sử dụng kiểm soát nguồn, bạn nên sử dụng di chuyển hoàn toàn tự động hoặc di chuyển hoàn toàn dựa trên mã. Do những hạn chế của di chuyển tự động, chúng tôi khuyên bạn nên sử dụng di chuyển dựa trên mã trong môi trường nhóm.


12

Trong trường hợp của tôi, EFMigrationsHistorybảng của tôi bị trống (bằng cách nào đó) và khi cố gắng chạy, update-databasetôi sẽ nhận được:

Đã có một đối tượng tên là 'AspNetUsers' trong cơ sở dữ liệu

Sau khi nhìn thấy bảng đã được làm trống, có nghĩa là nó đang cố chạy lại quá trình di chuyển ban đầu và cố gắng tạo lại các bảng.

Để khắc phục sự cố này, tôi đã thêm các hàng vào EFMigrationsHistorybảng của mình . 1 hàng cho mỗi lần di chuyển mà tôi biết rằng cơ sở dữ liệu đã được cập nhật.

Một hàng sẽ có 2 cột: MigrationIdProductVersion

MigrationIdlà tên của tệp di chuyển của bạn. Thí dụ:20170628112345_Initial

ProductVersionlà phiên bản ef bạn đang chạy. Bạn có thể tìm thấy điều này bằng cách nhập Get-Packagevào Bảng điều khiển Trình quản lý Gói và tìm kiếm gói ef của bạn.

Hy vọng điều này sẽ hữu ích cho ai đó.


1
Bạn đã điền cột Model như thế nào?
Ciaran Gallagher

7

Trong trường hợp của tôi, tôi đã đặt lại tên cho hợp ngữ có chứa mô hình khung thực thể mã đầu tiên. Mặc dù lược đồ thực tế đã không thay đổi ở tất cả các bảng di chuyển được gọi là

dbo.__MigrationHistory

chứa danh sách các di chuyển đã được thực hiện dựa trên tên lắp ráp . Tôi đã cập nhật tên cũ trong bảng di chuyển để khớp với tên mới và quá trình di chuyển sau đó hoạt động trở lại.


5

Đảm bảo rằng dự án khởi động giải pháp của bạn có kết nối chính xác trong tệp cấu hình. Hoặc đặt tham số -StartUpProjectName khi thực hiện lệnh cập nhật cơ sở dữ liệu. Tham số -StartUpProjectName chỉ định tệp cấu hình để sử dụng cho các chuỗi kết nối được đặt tên. Nếu bị bỏ qua, tệp cấu hình của dự án được chỉ định sẽ được sử dụng.

Đây là liên kết để tham khảo lệnh ef -igration http://coding.abel.nu/2012/03/ef-migrations-command-reference/


Câu trả lời này đã dẫn tôi đến sai lầm của mình, đơn giản là tôi đã chọn nhầm dự án là dự án Startup.
Martin Johansson

Tôi đang gặp sự cố tương tự và điều này đã khắc phục được cho tôi.
JordanTDN

3

Tôi đã gặp phải vấn đề tương tự và sau ba giờ vật lộn, tôi tìm ra điều gì đang xảy ra

Trong trường hợp của tôi, khi tôi muốn di chuyển cho lần đầu tiên trong up()phương pháp, mã mặc định muốn tạo ra các bảng đã tồn tại vì vậy tôi đã cùng một lỗi như bạn

Để giải quyết nó, chỉ cần xóa những đoạn mã đó và viết bạn muốn. Ví dụ: tôi muốn thêm một cột nên tôi chỉ viết

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

Có vẻ như một câu trả lời hay nhưng bạn có thể muốn kiểm tra chính tả của mình. Bạn cũng có thể sử dụng các đoạn mã để làm rõ dòng cuối cùng là mã. Nhắn tin cho tôi nếu bạn muốn giúp đỡ về điều này.
Mike Poole

Nhờ thế nào tôi có thể xoa bóp bạn
Arfa

1
Thực hiện tốt việc thêm đoạn mã @arfa. Không cần massage :). Nếu bạn muốn nhắn tin cho tôi, chỉ cần nhập @tên người dùng của tôi vào phần nhận xét.
Mike Poole

3

Lưu ý: không khuyến khích giải pháp. nhưng sửa chữa nhanh chóng trong một số trường hợp.

Đối với tôi, dbo._MigrationHistorytrong cơ sở dữ liệu sản xuất đã bỏ lỡ các bản ghi di chuyển trong quá trình xuất bản, nhưng cơ sở dữ liệu phát triển có tất cả các bản ghi di chuyển.

Nếu bạn chắc chắn rằng production db có lược đồ giống và mới nhất so với dev db, việc sao chép tất cả các bản ghi di chuyển sang production db có thể giải quyết được sự cố.

Bạn chỉ có thể làm với VisualStudio.

  1. Mở bảng điều khiển 'SQL Server Object Explorer'> nhấp chuột phải vào dbo._MigrationHistorybảng trong cơ sở dữ liệu nguồn (trong trường hợp của tôi là dev db)> Nhấp vào menu "So sánh Dữ liệu ...".
  2. Sau đó, trình hướng dẫn So sánh Dữ liệu bật lên, chọn cơ sở dữ liệu đích (trong trường hợp của tôi là db sản xuất) và nhấp vào Tiếp theo.
  3. Một vài giây sau, nó sẽ hiển thị một số bản ghi chỉ trong cơ sở dữ liệu nguồn. chỉ cần nhấp vào nút 'Cập nhật Mục tiêu'.
  4. Trong trình duyệt, nhấn nút refresh và thấy thông báo lỗi biến mất.

Lưu ý rằng, một lần nữa, nó không được khuyến khích trong dự án phức tạp và nghiêm trọng. Sử dụng điều này chỉ khi bạn gặp vấn đề trong quá trình học ASP.Net hoặc EntityFramework.


1
Điều này đã làm việc cho tôi. Tuy nhiên, đó là một cách khác. Db sản xuất của tôi có tất cả các bản ghi trong __EFMigrationHistory, trong khi những bản ghi trong db dev bị thiếu bằng cách nào đó (ngoại trừ cái đầu tiên).
Jens Mander

1

Xóa các hàng khỏi bảng dbo_MigrationHistory hoặc xóa bảng và chạy

update-database -verbose

Nó sẽ chạy lần lượt tất cả các lần di chuyển trong dự án của bạn


1

Trong trường hợp của tôi, vấn đề là ở Seeder. Tôi đang gọi _ctx.Database.EnsureCreate () bên trong nó và theo như tôi hiểu, lệnh cập nhật cơ sở dữ liệu đã thực thi thành công, nhưng sau đó seeder đã cố gắng tạo cơ sở dữ liệu lần thứ hai.

Cách xưng hô:

  1. Thực hiện cập nhật nut chạy, chỉ cần khởi động ứng dụng và gọi EnsureCreate (). Cơ sở dữ liệu sẽ được tạo / cập nhật
  2. Nhận xét hoặc loại bỏ seeder.

1

Một kịch bản EF Core trường hợp cạnh khác.

Kiểm tra xem bạn có tệp Migrations / YOURNAMEContextModelSnapshot.cs không .

như chi tiết trong - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

Nếu bạn đã cố gắng tạo lại cơ sở dữ liệu của mình theo cách thủ công bằng cách xóa các tệpigration.cs, hãy cẩn thận rằng tệp Migrations / * ContextModelSnapshot.cs của bạn vẫn tồn tại.

Nếu không có nó, các lần di chuyển tiếp theo của bạn không có ảnh chụp nhanh để tạo ra các khác biệt cần thiết và các tệp di chuyển mới của bạn sẽ trông giống như chúng đang tạo lại mọi thứ từ đầu, khi đó bạn sẽ gặp lỗi bảng hiện có như trên.


1

Điều tương tự đã xảy ra với tôi .. Vấn đề là Trên thực tế, tôi đã xóa bảng Cơ sở dữ liệu của mình MoviesCastvà tạo bảng mới và vấn đề là lần di chuyển cuối cùng của tôi đang cố gắng tạo ra bảng bị xóa MoviesCasttrong cơ sở dữ liệu. Tôi đã giải quyết nó bằng cách đơn giản xóa tất cả nội dung của lần di chuyển cuối cùng và chỉ cần chạy phương thức Up () & down ()

public override void Up()
{
}

public override void Down()
{
}

sau đó cập nhật cơ sở dữ liệu và chỉ cần thêm di chuyển mới


1

Tôi có cùng một vấn đề được mô tả trong câu trả lời mà Elnaz đã đưa ra. Tôi có yêu cầu thay đổi không gian tên của trình ghi dữ liệu trong quá trình tái cấu trúc dự án của chúng tôi. Điều này làm cho quá trình di chuyển không thấy các di chuyển hiện có trong cơ sở dữ liệu. Tôi đã tìm thấy một câu trả lời tuyệt vời cho vấn đề này mà James Chambers đã viết blog.

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

Tôi chỉ cần thay đổi phần sau trong tệp cấu hình Di chuyển.

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

Hy vọng điều này sẽ giúp người khác trong một ràng buộc.


Tôi đã gặp trường hợp tương tự sau khi thay đổi không gian tên. Đã thử sửa lỗi này, nhưng nó vẫn không hoạt động. Vì vậy, tôi đã sửa đổi không gian tên theo cách thủ công trong bảng cơ sở dữ liệu, và sau đó nó bắt đầu hoạt động.
kosist

0

Chỉ cần thực hiện lệnh update -igration -Script. Điều này tạo ra tập lệnh * .sql mới bao gồm tất cả các thay đổi DB được bao gồm trong quá trình di chuyển. Cuối đoạn mã là các lệnh chèn như sau: INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion]), bạn có thể chỉ cần chạy tất cả INSERT và DB sẽ được đồng bộ hóa


0

Sau hơn một giờ không nhận được bất kỳ kết quả nào, tôi đã thử một cách tiếp cận khác, không sử dụng di chuyển nhưng tôi đã thực hiện một so sánh giản đồ.

Trong Visual Studio -> Công cụ -> SQL Server -> So sánh lược đồ mới

Đầu tiên, tôi đã tạo một cơ sở dữ liệu hoàn toàn mới với di chuyển EF. Tôi đã so sánh, so sánh cơ sở dữ liệu mới với cơ sở dữ liệu tôi muốn cập nhật. Cuối cùng đã tạo một tập lệnh di chuyển và tôi có thể thực hiện cập nhật giản đồ.


0

Trong trường hợp của tôi (muốn đặt lại và lấy cơ sở dữ liệu mới),

Đầu tiên tôi nhận được thông báo lỗi: There is already an object named 'TABLENAME' in the database.

và tôi đã thấy, một chút trước đây:

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

Cơ sở dữ liệu của tôi đã được tạo, nhưng không có bản ghi nào trong lịch sử di chuyển.

Tôi bỏ tất cả các bảng ngoại trừ dbo .__ MigrationsHistory

MigrationsHistory trống.

Chạy dotnet ef database update -c StudyContext --verbose

(--verbose chỉ cho vui)

và có Done.


0

Tôi phải đối mặt với cùng một lỗi như dưới đây. Sau đó, tôi đã sửa nó như sau:

  1. Kiểm tra cơ sở dữ liệu hiện tại trong dự án của bạn:
    • dotnet ef migrations list
  2. Nếu mới nhất là những gì bạn đã thêm, hãy xóa nó:
    • dotnet ef migrations remove
  3. Đầu ra đảm bảo của cơ sở dữ liệu này phải được tách ra trong mã nguồn: tệp .cs / .Designer.cs

4. Bây giờ nó là tốt. Hãy thử thêm lại: dotnet ef migrations add [new_dbo_name]

5. Cuối cùng, hãy thử cập nhật lại, theo sự sắp xếp dựa trên danh sách di chuyển:

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

Hy vọng nó hữu ích cho bạn. ^^


0

Bạn đã xóa thư mục di chuyển mà bạn đang cố gắng chạy lệnh "update-database" trên bảng điều khiển trình quản lý gói? nếu vậy

Chỉ cần xóa thủ công tất cả các bảng của bạn Sau khi chạy nếu update-databse (dữ liệu gốc khuyết điểm sẽ bị xóa)


0

Một cách khác để làm điều đó là nhận xét mọi thứ trong Lớp ban đầu, giữa Phương thức Lên và Phương thức xuống. Sau đó chạy update-database, sau khi chạy seed method thành công, hãy chạy lại update-database. Có thể hữu ích với một số bạn.


0

Tôi đã phải đối mặt với cùng một vấn đề. Tôi đã thử giải pháp dưới đây: 1. xóa mã tạo bảng từ Up () và mã liên quan từ phương thức Down () 2. Chạy lệnh update-database trong Package Manager Consol

điều này đã giải quyết vấn đề của tôi


0

Lưu ý: Tôi đã làm điều đó vì tôi không có bất kỳ thứ gì trong cơ sở dữ liệu của mình. Trong trường hợp của tôi: 1. Tôi đã xóa di chuyển bằng lệnh remove -igration trong Bảng điều khiển Trình quản lý Gói 2. Đã xóa cơ sở dữ liệu bằng bảng điều khiển 'SQL Server Object Explorer'> trên cơ sở dữ liệu hiện tại> nhấp chuột phải> Xóa 3. Đã di chuyển trong Bảng điều khiển Trình quản lý Gói, viết Thêm -Di chuyển và nhấp Enter 4. Cập nhật cuối cùng bằng lệnh update-database


0

Trường hợp tương tự (không có bảng DB và MigrationHistory trên Máy chủ). Các bước của tôi:

  1. Tôi đã xóa dữ liệu Di chuyển khỏi phần Lên và xuống trong lần di chuyển đầu tiên của mình.
  2. Cập nhật cơ sở dữ liệu với di chuyển trống (bảng MigrationHistory đã được tạo)
  3. Thêm di chuyển THỰC của bạn và cập nhật cơ sở dữ liệu với nó.

0

Trong cơ sở dữ liệu, truy vấn bảng __MigrationHistory và sao chép [ContextKey].

Dán nó vào DbMigrationsConfiguration ConextKey như bên dưới

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

0

Các bước dưới đây phù hợp với tôi cho cùng một vấn đề:

Tình huống:

Tôi đang cố gắng thêm 2 trường mới vào mô hình hiện có của mình cho chức năng Email. Các trường mới là "IsEmailVerified" và "ActivationCode"

Các bước tôi đã làm theo:

1. Xóa các tệp di chuyển cũ trong thư mục "Migrations" ngăn tôi thực hiện Cập nhật-Cơ sở dữ liệu 2. Đã bắt đầu tất cả các thay đổi gần đây của tôi mà tôi đã thực hiện trên mô hình

3. Chạy lệnh dưới đây:

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

4. Xóa nội dung từ các phương thức Up () và Down () khỏi tệp di chuyển và để trống các phương thức

5. chạy lệnh dưới đây:

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

  1. Sau khi thực hiện bước trên, mô hình và DB trông đồng bộ.

  2. Bây giờ, tôi đã thêm các thuộc tính mới trong mô hình

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. Chạy lệnh dưới đây:

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

  1. Bây giờ tệp di chuyển chỉ chứa những thay đổi gần đây của tôi như bên dưới:

       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. Chạy lệnh dưới đây: Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = " ***

11.Bây giờ tôi đã cập nhật thành công cơ sở dữ liệu với các cột bổ sung.

Bảng dưới đây được cập nhật sau những thay đổi gần đây:

Bảng sau khi di chuyển bản cập nhật


thực sự không khuyến khích điều này, xóa di chuyển sản xuất sẽ chỉ phá hủy môi trường của bạn. tại sao bạn phải xóa di chuyển của mình nếu chúng hoạt động cho đến nay? và các chuỗi kết nối của bạn sẽ không hoạt động với mọi người dùng ở đây, không nên chạy chúng như vậy
rakuens

-5

Trong tệp di chuyển, hãy kiểm tra phương thức void Up () ghi đè công khai . Có thể bạn đang cố tạo một đối tượng db mới đã có trong cơ sở dữ liệu. Vì vậy, bạn cần phải thả đối tượng / bảng này trước khi tạo đối tượng db. Cứ làm như dưới đây-

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

Và bây giờ hãy chạy quá trình di chuyển của bạn Update-Database -TargetMigration: "2016_YourMigration"


6
Nếu bạn làm điều này, bạn sẽ mất tất cả dữ liệu của mình
Mehdiway
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.