ডাটাবেসে ইতিমধ্যে একটি অবজেক্টের নাম রয়েছে


115

আপডেট-ডেটাবেস প্যাকেজ ম্যানেজার কনসোল থেকে ব্যর্থ। আমি সত্ত্বা ফ্রেমওয়ার্ক 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)
    {

    }
}

আমার ডিবি কনটেক্সটটি হ'ল:

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> 

আমি কীভাবে এটি করতে পারি (বিদ্যমান ডিজাইনে ম্যাপিং)?
বলেছেন রুহুল্লাহ আলেমে

15
@ এইচএলজিইএম, যদি "সু-নকশিত ডাটাবেস" ইএফ ব্যবহার করে কোনও বস্তু মডেলটিতে ম্যাপ করা যায় তবে ইএফ এটি তৈরি করতে সক্ষম হয়। ডিবি মাইগ্রেশন হ'ল একটি শক্তিশালী সরঞ্জাম যা আপনার ডেটা বেসের ব্যবহার সহজ করে তোলে। আমি ডিবি স্থানান্তর ব্যবহার এড়াতে পরামর্শ দেব না। অন্যথায় প্যাচ স্ক্রিপ্টগুলি যেভাবেই প্রয়োজন। আমি ঠিক ডিবি মাইগ্রেশন ব্যবহার করার পরামর্শ দেব।
ইলিয়া পলকিন

উত্তর:


129

মনে হচ্ছে মাইগ্রেশন প্রক্রিয়াতে সমস্যা আছে, "প্যাকেজ ম্যানেজার কনসোল" -তে অ্যাড-মাইগ্রেশন কমান্ড চালান:

অ্যাড-মাইগ্রেশন ইনিশিয়াল -আইগনোর পরিবর্তনগুলি

কিছু পরিবর্তন করুন এবং তারপরে "প্রাথমিক" ফাইল থেকে ডাটাবেস আপডেট করুন:

আপডেট-ডাটাবেস -ভারবস

সম্পাদনা করুন: -আইগনোর চেঞ্জগুলি EF6 এ রয়েছে তবে EF কোরে নেই, এখানে একটি কার্যকারিতা রয়েছে: https://stackoverflow.com/a/43687656/495455


8
এটি ঠিক কী করে? এটি কি নতুন মডেলটিকে কেবল পুরানোটিকে ওভাররাইট করার অনুমতি দেয়?
ট্র্যাভিস টিউবস

1
আমি ম্যানুয়াল মাইগ্রেশন ব্যবহার শুরু করেছি কারণ আমি আমার ডাটাবেসে ভিউ পাশাপাশি টেবিলগুলি ব্যবহার করি। আমি স্বয়ংক্রিয়ভাবে স্থানান্তরগুলি ব্যবহার করার চেষ্টা করার ভুল করেছিলাম এবং ফলস্বরূপ এটি একটি ভিউ থেকে একটি সারণী তৈরি করার চেষ্টা করছিল। এই দৃশ্যে আপনার সমাধানটি কাজ করে না, এর পরিবর্তে সর্বদা ম্যানুয়াল মাইগ্রেশন ব্যবহার করা উচিত। সুতরাং এটি করার পরে আমাকে উত্স নিয়ন্ত্রণের পরিবর্তনগুলি পূর্বাবস্থায় ফেলা এবং _ অভিবাসন টেবিল থেকে "প্রাথমিক" এন্ট্রি সরিয়ে ফেলতে হয়েছিল।
arame3333

3
এটি কেবল আমাকে একটি অসীম লুপে নিয়ে যায়: প্যাকেজ ম্যানেজার কনসোল আমাকে অ্যাড-মাইগ্রেশন করতে দেয় না কারণ এটি একটি ত্রুটি দেয় "একটি স্পষ্টভাবে মাইগ্রেশন তৈরি করতে অক্ষম কারণ নিম্নলিখিত বর্ণনাকারী মাইগ্রেশন বিচারাধীন রয়েছে ..." নামটি ইনারিয়েশনক্রিট। তবে যদি আমি সেই আপডেট-ডাটাবেসটি সফলভাবে চালাতে না পারি তবে কিছু প্রাথমিক-ইগনোরচেন্জ রয়েছে, তবে আমার কী করার কথা ??
পূর্ব কোথাও

6
অ্যাড-মাইগ্রেশন: প্যারামিটারের সাথে 'IgnoreChanges' নামের প্যারামিটারের মিল পাওয়া যায় না।
Tzvi গ্রেগরি কাইদানভ

3
@ ট্র্যাভিসটবস এটি আপনার করা পরিবর্তনগুলি উপেক্ষা করে এবং মাইগ্রেশন টেবিলের সাথে আপনার মডেলটি ডিবি-র সাথে সিঙ্ক হয়েছে বলে "নকল" উপেক্ষা করে। আপনার এখনও দুটি ম্যানুয়ালি সিঙ্ক করতে হবে; আমার ক্ষেত্রে আমি মডেলটিতে পরিবর্তনগুলি সরিয়ে নিয়েছি, একটি অ্যাড-মাইগ্রেশন করেছি, আপডেট-ডাটাবেস করার আগে উপরের / নীচের পদ্ধতিগুলি থেকে সামগ্রী সরিয়ে নিয়েছি - এটি ব্রেকিং মাইগ্রেশনের আগে আমাকে রাজ্যে ফিরিয়ে দিয়েছে। তারপরে আমি আসলে পরিবর্তনগুলি আবার যুক্ত করেছিলাম, যথারীতি অ্যাড-মাইগ্রেশন এবং আপডেট-ডাটাবেস করেছি - এবার সবকিছু সিঙ্ক হয়েছে
ডেভিড রেফেলি

73

হয়তো আপনি আপনার প্রকল্পের নাম স্থান পরিবর্তন করেছেন!
আপনার ডেটা বেসে একটি টেবিল রয়েছে dbo.__MigrationHistory। টেবিলটির একটি কলাম রয়েছে ContextKey
এই কলামটির মান আপনার উপর ভিত্তি করে namespace। উদাহরণস্বরূপ " DataAccess.Migrations.Configuration"।
আপনি যখন নেমস্পেস পরিবর্তন করেন, এটি বিভিন্ন নেমস্পেসের সাথে সারণীর নামগুলি নকল করে।
সুতরাং, আপনি কোড সাইডে নেমস্পেস পরিবর্তন করার পরে, এই টেবিলের নাম স্থানটি ডাটাবেসেও পরিবর্তন করুন (সমস্ত সারিগুলির জন্য)।
উদাহরণস্বরূপ, আপনি যদি নেমস্পেসটি পরিবর্তন করেন EFDataAccessতবে আপনার ContextKeyকলামের মানগুলিকে dbo.__MigrationHistory" EFDataAccess.Migrations.Configuration" এ পরিবর্তন করা উচিত ।
তারপরে কোড সাইডে, সরঞ্জামগুলি => প্যাকেজ ম্যানেজার কনসোলে, update-databaseকমান্ডটি ব্যবহার করুন ।

ডাটাবেসে প্রসঙ্গের মান পরিবর্তনের পরিবর্তে আর একটি বিকল্প হ'ল আপনার কোডের প্রসঙ্গের মানটি পুরানো নেমস্পেস মানকে হার্ড কোড করা। উত্তরাধিকার সূত্রে DbMigrationsConfiguration<YourDbContext>এবং কন্সট্রাক্টরের মাধ্যমে এটি সম্ভব, কেবলমাত্র এই শ্রেণীর ContextKeyউত্তরাধিকারী হওয়া MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>এবং খালি রাখার চেয়ে পুরানো প্রসঙ্গের মান নির্ধারণ করুন । Database.SetInitializer(new YourDbInitializer());স্ট্যাটিক কনস্ট্রাক্টরে আপনার ডিবি কনটেক্সটে কল করা শেষ কাজ ।

আমি আশা করি আপনার সমস্যার সমাধান হয়ে যাবে।


9
দুর্দান্ত, আমাদের ঠিক এই সমস্যাটি ছিল!
অলিভিয়ার রোমান্ড 11'16

3
আসলে এটিই এই ত্রুটির আসল কারণ। ইএফ ডাটাবেস তৈরি করার চেষ্টা করছে কারণ এটি পড়তে পারে না যে নাম স্থানের পার্থক্যের কারণে ডাটাবেসে কোন মাইগ্রেশন প্রয়োগ করা হয়
উফুকসুরমেন

এই উত্তরটির ধন্যবাদ, আমাকে অনেক সাহায্য করেছে, যেমন অলিভিয়ার রোমান্ড বলেছিলেন, আমার ঠিক এই সমস্যাটি ছিল!
এনারিক এ। পিনেলো নভো

এটি সম্পর্কে কোনও ধারণা ছিল না, তবে কোনওভাবে এমনকি MigrationHistoryটেবিলের রেকর্ডগুলি সরিয়ে ফেলতে আমার পক্ষে এটি ঠিক করা হয়নি ... তাই আমি আমার সমস্ত টেবিলগুলি ফেলে দিয়েছি এবং EF কে আবার সমস্ত তৈরি করতে দিয়েছি, ছোট অ্যাপ, কোনও বড় জিনিস নেই g .. তবে এটি আমার জন্য এটি স্থির করে দিয়েছে।
নিক্লাস

এটি বিশদ সহ সঠিক উত্তর, এটি উল্লেখ করা ভাল যে কখনও কখনও ভুল বানান ফোল্ডারের নাম এই সমস্যার কারণ হতে পারে।
H35am

17

"ডাটাবেসে ইতিমধ্যে 'AboutUs' নামে একটি অবজেক্ট রয়েছে" "

এই ব্যতিক্রম আপনাকে বলে যে কেউ ইতিমধ্যে ডাটাবেসে 'AboutUs' নামে একটি অবজেক্ট যুক্ত করেছে।

AutomaticMigrationsEnabled = true;এই ক্ষেত্রে ডেটা বেস ভার্সনগুলি আপনার দ্বারা নিয়ন্ত্রিত না হওয়ার কারণে এটি হতে পারে। অনুমানযোগ্য মাইগ্রেশন এড়াতে এবং দলের প্রতিটি বিকাশকারী একই ডেটা বেস কাঠামোর সাথে কাজ করে তা নিশ্চিত করার জন্য আমি আপনাকে পরামর্শ দিচ্ছিAutomaticMigrationsEnabled = false;

আপনি খুব যত্নশীল এবং কোনও প্রকল্পের একমাত্র বিকাশকারী যদি স্বয়ংক্রিয় স্থানান্তর এবং কোডেড মাইগ্রেশনগুলি পাশাপাশি থাকতে পারে।

ডেটা বিকাশকারী কেন্দ্রে স্বয়ংক্রিয় কোড প্রথম মাইগ্রেশন পোস্টের একটি উদ্ধৃতি রয়েছে :

স্বয়ংক্রিয় স্থানান্তর আপনাকে আপনার প্রতিটি পরিবর্তনের জন্য আপনার প্রকল্পে কোনও কোড ফাইল না করেই কোড ফার্স্ট মাইগ্রেশন ব্যবহার করতে দেয়। সমস্ত পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে প্রয়োগ করা যায় না - উদাহরণস্বরূপ কলামের নামগুলির জন্য একটি কোড ভিত্তিক মাইগ্রেশন ব্যবহার প্রয়োজন।

দল পরিবেশের জন্য প্রস্তাবনা

আপনি স্বয়ংক্রিয় এবং কোড-ভিত্তিক মাইগ্রেশন ছেদ করতে পারেন তবে এটি টিম বিকাশের পরিস্থিতিতে প্রস্তাবিত নয়। আপনি যদি সোর্স কন্ট্রোল ব্যবহার করে এমন বিকাশকারীদের একটি দলের অংশ হন তবে আপনি খাঁটি স্বয়ংক্রিয়ভাবে মাইগ্রেশন বা খাঁটি কোড ভিত্তিক মাইগ্রেশন ব্যবহার করা উচিত। টিম এনভায়রনমেন্টগুলিতে কোড-ভিত্তিক মাইগ্রেশন ব্যবহার করার প্রস্তাব আমরা স্বয়ংক্রিয় স্থানান্তর সীমাবদ্ধতা দেওয়া।


12

আমার ক্ষেত্রে, আমার EFMigrationsHistoryটেবিলটি খালি করা হয়েছিল (কোনওভাবে) এবং চালানোর চেষ্টা করার সময় update-databaseআমি পেয়ে যাব:

ইতিমধ্যে ডাটাবেসে 'AspNetUser' নামে একটি অবজেক্ট রয়েছে

সারণীটি খালি হয়ে যাওয়ার পরে বোঝা গেল যে এটি প্রাথমিক স্থানান্তর পুনরায় চালনার চেষ্টা করছে এবং টেবিলগুলি পুনরায় তৈরি করার চেষ্টা করছে।

এই সমস্যাটি সমাধান করতে আমি আমার EFMigrationsHistoryটেবিলের মধ্যে সারি যুক্ত করেছি । প্রতিটি মাইগ্রেশনের জন্য 1 সারি যা আমি জানতাম যে ডাটাবেসটি আপ টু ডেট ছিল।

একটি সারিতে 2 টি কলাম থাকবে: MigrationIdএবংProductVersion

MigrationIdআপনার স্থানান্তর ফাইলের নাম। উদাহরণ:20170628112345_Initial

ProductVersionআপনি যে ইফ সংস্করণটি চালাচ্ছেন তা কি? আপনি Get-Packageপ্যাকেজ ম্যানেজার কনসোলে টাইপ করে এবং আপনার ef প্যাকেজটি সন্ধান করে এটি খুঁজে পেতে পারেন ।

আশা করি এটি কারও জন্য সহায়ক।


1
আপনি কীভাবে মডেল কলামটি জনপ্রিয় করেছেন?
সিয়েরান

7

আমার ক্ষেত্রে আমি অ্যাসেমব্লিকে পুনরায় নামকরণ করেছি যাতে কোড-প্রথম সত্তা ফ্রেমওয়ার্ক মডেল রয়েছে। যদিও ডাকা সমস্ত মাইগ্রেশন সারণীতে প্রকৃত স্কিমা পরিবর্তন হয়নি

dbo.__MigrationHistory

পুরানো সমাবেশ নামের উপর ভিত্তি করে ইতিমধ্যে সম্পাদিত মাইগ্রেশনগুলির একটি তালিকা রয়েছে । নতুনটির সাথে মেলে মাইগ্রেশন টেবিলের পুরানো নামটি আপডেট করেছি এবং মাইগ্রেশনটি আবার কাজ করেছে।


5

আপনার সমাধানগুলির সূচনা প্রকল্পটি কনফিগার ফাইলে সঠিক সংযোগের ব্যবস্থা রয়েছে তা নিশ্চিত করুন। অথবা আপডেট-ডাটাবেস কমান্ডটি সঞ্চালনের সময় -StartUpProjectName পরামিতি সেট করুন। -স্টার্টআপপ্রজেক্টনাম পরামিতি নামযুক্ত সংযোগ স্ট্রিংয়ের জন্য কনফিগারেশন ফাইলটি নির্দিষ্ট করে। বাদ দেওয়া থাকলে, নির্দিষ্ট প্রকল্পের কনফিগারেশন ফাইলটি ব্যবহৃত হয়।

ইফ-মাইগ্রেশন কমান্ড রেফারেন্সের জন্য এখানে একটি লিঙ্ক দেওয়া হয়েছে http://coding.abel.nu/2012/03/ef-migration-command-references/


এই উত্তরটি আমাকে আমার ভুলের দিকে নিয়ে গেল, স্টার্টআপ প্রকল্প হিসাবে আমার কেবল ভুল প্রকল্প ছিল।
মার্টিন জোহানসন

আমারও অনুরূপ সমস্যা ছিল এবং এটি আমার জন্য এটি স্থির করে।
জর্ডানটিএনএন

3

আমার একই সমস্যা ছিল এবং তিন ঘন্টা লড়াইয়ের পরে আমি জানতে পারি যে কী চলছে

আমার ক্ষেত্রে, আমি যখন up()পদ্ধতিতে প্রথমবারের মতো স্থানান্তরিত করতে চেয়েছিলাম , তখন ডিফল্ট কোডটি ইতিমধ্যে বিদ্যমান সারণীগুলি তৈরি করতে চায় তাই আপনার মতো ত্রুটি পেয়েছি I

এটি সমাধানের জন্য, কেবলমাত্র সেই কোডগুলি মুছুন এবং আপনি চান তা লিখুন। উদাহরণস্বরূপ, আমি একটি কলাম যুক্ত করতে চেয়েছিলাম যাতে আমি কেবল লিখি

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

ভালো উত্তর বলে মনে হচ্ছে তবে আপনি নিজের বানানটি পরীক্ষা করতে চাইতে পারেন। আপনি সর্বশেষ লাইনের কোডটি পরিষ্কার করে দেওয়ার জন্য কোড স্নিপেট ব্যবহার করতে পারেন। আপনি যদি এই বিষয়ে সাহায্য চান তবে আমাকে বার্তা দিন।
মাইক পুল

ধন্যবাদ আমি কীভাবে আপনাকে ম্যাসেজ করতে পারি
আরফা

1
@ সর্প কোড স্নিপেট যুক্ত করার জন্য ভাল হয়েছে। কোনও ম্যাসেজের দরকার নেই :)। আপনি যদি আমাকে বার্তা দিতে চান @তবে মন্তব্য বিভাগে আমার ব্যবহারকারীর নামটি অনুসরণ করুন।
মাইক পুল

3

দ্রষ্টব্য: প্রস্তাবিত সমাধান নয়। তবে কিছু ক্ষেত্রে দ্রুত সমাধান।

আমার জন্য, dbo._MigrationHistoryউত্পাদনের ডাটাবেসে প্রকাশ প্রক্রিয়া চলাকালীন মাইগ্রেশন রেকর্ড মিস হয় তবে বিকাশ ডাটাবেসে সমস্ত মাইগ্রেশন রেকর্ড থাকে।

আপনি যদি নিশ্চিত হন যে ডিড ডিবিয়ের তুলনায় প্রোডাকশন ডিবি-তে একই-ও-নতুন স্কিমা রয়েছে, তবে সমস্ত মাইগ্রেশন রেকর্ডকে প্রোডাকশন ডিবিতে অনুলিপি করা সমস্যার সমাধান করতে পারে।

আপনি সম্পূর্ণভাবে ভিজ্যুয়াল স্টুডিওতে করতে পারেন do

  1. 'এসকিউএল সার্ভার অবজেক্ট এক্সপ্লোরার' প্যানেল খুলুন> dbo._MigrationHistoryউত্সে টেবিলের ডান ক্লিক করুন (আমার ক্ষেত্রে ডেবি ডিবি) ডাটাবেস> "ডেটা তুলনা ..." মেনু ক্লিক করুন।
  2. তারপরে, ডেটা তুলনা উইজার্ড পপ আপ, লক্ষ্য ডাটাবেস নির্বাচন করুন (আমার ক্ষেত্রে উত্পাদন ডিবি) এবং পরবর্তী ক্লিক করুন।
  3. কয়েক সেকেন্ড পরে, এটি কেবল উত্স ডাটাবেসে কিছু রেকর্ড প্রদর্শন করবে। কেবলমাত্র 'আপডেট টার্গেট' বোতামটি ক্লিক করুন।
  4. ব্রাউজারে, রিফ্রেশ বোতামটি চাপুন এবং দেখুন ত্রুটি বার্তাটি গেছে।

দ্রষ্টব্য, আবারও এটি জটিল এবং গুরুতর প্রকল্পে প্রস্তাবিত নয়। এএসপি. নেট বা এন্টি ফ্রেমওয়ার্ক শেখার সময় আপনার কেবল সমস্যাটি এটি ব্যবহার করুন।


1
এটি আমার পক্ষে কাজ করেছে। যদিও এটি অন্যদিকে ছিল। আমার প্রযোজনা ডিবি-র সমস্ত রেকর্ড __EFMigrationHistory এ ছিল, যদিও দেব ডিবিতে যারা সেখানে কোনওরকম অনুপস্থিত (প্রাথমিক একটি ব্যতীত)।
জেনস ম্যান্ডার

1

Dbo_MigrationHistory টেবিল থেকে সারি মুছুন বা টেবিলটি মুছুন এবং চালান

update-database -verbose

এটি আপনার প্রকল্পের সমস্ত স্থানান্তর এক এক করে চালাবে run


1

আমার ক্ষেত্রে, বিষয়টি সিডারে ছিল। আমি এর ভিতরে _ctx.Database.EnsureCreated () কল করছিলাম এবং যতদূর বুঝতে পেরেছি, আপডেট ডাটাবেস কমান্ড সফলভাবে কার্যকর হয়েছে, তবে সিডার ডাটাবেস "দ্বিতীয়" সময় তৈরি করার চেষ্টা করেছিল।

কীভাবে সম্বোধন করবেন:

  1. বাদাম চালানোর আপডেট করুন, কেবল অ্যাপ্লিকেশন শুরু করুন এবং এনএসিউরক্রিয়েটেড () কল করুন। ডাটাবেস তৈরি / আপডেট করা হবে
  2. মন্তব্য করুন বা সিডার অপসারণ।

1

আর একটি এজ-কেস EF মূল দৃশ্যের।

আপনার কোনও অভিবাসন / YOURNAMEContextModelSnaphot.cs ফাইল আছে কিনা তা পরীক্ষা করুন।

এতে বিস্তারিত হিসাবে রয়েছে - https://docs.microsoft.com/en-us/ef/core/manasing-schemas/migration/#create-a-migration

যদি আপনি মাইগ্রেশন.সি.এস ফাইলগুলি মুছে ফেলা করে ম্যানুয়ালি আপনার ডাটাবেসটি পুনরায় তৈরি করার চেষ্টা করে থাকেন তবে সতর্কতা অবলম্বন করুন যে আপনার মাইগ্রেশন / * কনটেক্সটমোডেলস্ন্যাপশট ফাইলগুলি এখনও বিদ্যমান আছে।

এটি না করে, আপনার পরবর্তী মাইগ্রেশনগুলির কোনও স্নাপশট নেই যার উপর প্রয়োজনীয় পার্থক্য তৈরি করতে হবে এবং আপনার নতুন মাইগ্রেশন ফাইলগুলি দেখতে মনে হবে যে তারা আবার স্ক্র্যাচ থেকে পুনরায় সবকিছু তৈরি করছে, আপনি তারপরে উপরের মতো বিদ্যমান সারণী ত্রুটিটি পেয়ে যাবেন।


1

আমার সাথে একই ঘটনা ঘটেছিল ... সমস্যাটি হ'ল আসলে আমি আমার ডাটাবেস টেবিলটি মুছে MoviesCastফেলে নতুন টেবিল তৈরি করেছিলাম এবং সমস্যাটি হ'ল আমার শেষ স্থানান্তরটি মুছে ফেলা টেবিলটিকে MoviesCastডাটাবেসে প্ররোচিত করার চেষ্টা করছিল । আমি শেষ মাইগ্রেশনের সমস্ত সামগ্রী সরিয়ে এটিকে সমাধান করেছি এবং কেবল () এবং ডাউন () পদ্ধতিতে দৌড়েছি

public override void Up()
{
}

public override void Down()
{
}

তারপরে ডাটাবেস আপডেট করে কেবল নতুন স্থানান্তর যুক্ত করুন


1

এলনাজ যে উত্তর দিয়েছে তাতে আমার একই সমস্যা ছিল। আমাদের প্রকল্পের রিফ্যাক্টরিংয়ের সময় আমার ডেটালেয়ারের নাম স্থান পরিবর্তন করার প্রয়োজন ছিল। এটি মাইগ্রেশনগুলির ফলে ডাটাবেসে বিদ্যমান স্থানান্তরগুলি দেখতে না পেয়েছিল। এই সমস্যাটির আমি একটি দুর্দান্ত উত্তর পেয়েছি যা জেমস চেম্বারস ব্লগ করেছে।

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

আশা করি এটি অন্য কাউকে বাঁধতে সহায়তা করবে।


নেমস্পেস পরিবর্তনের পরেও আমার একই অবস্থা ছিল। এই ফিক্সটি চেষ্টা করে দেখুন, কিন্তু এটি এখনও কার্যকর হয়নি। সুতরাং আমি ডাটাবেস সারণীতে ম্যানুয়ালি নেমস্পেসগুলি সংশোধন করেছি এবং তারপরে এটি কাজ শুরু করে।
কোসিস্ট

0

কেবল কমান্ড আপডেট-মাইগ্রেশন-স্ক্রিপ্ট কার্যকর করুন। এটি নতুন *। এসকিউএল স্ক্রিপ্ট তৈরি করে যা মাইগ্রেশনে অন্তর্ভুক্ত সমস্ত ডিবি পরিবর্তনগুলি অন্তর্ভুক্ত করে। কোডের শেষে কমান্ডগুলি সন্নিবেশ করানো হয়: INSERT [dbo]। [__ মাইগ্রেশন হিস্ট্রি] ([মাইগ্রেশনআইড], [কনটেক্সটকি], [মডেল], [প্রোডাক্ট ভার্সন]) আপনি কেবল এই সমস্ত INSERT চালাতে পারেন এবং ডিবি সিঙ্ক্রোনাইজ করা হবে


0

কোনও ফল না পাওয়ার এক ঘণ্টারও বেশি সময় পরে আমি অন্য পদ্ধতির চেষ্টা করেছিলাম, মাইগ্রেশন ব্যবহার না করেই আমি একটি স্কিমা তুলনা করেছি।

ভিজ্যুয়াল স্টুডিওতে -> সরঞ্জাম -> এসকিউএল সার্ভার -> নতুন স্কিমা তুলনা

প্রথমে আমি ইএফ মাইগ্রেশন সহ একটি সম্পূর্ণ নতুন নতুন ডাটাবেস তৈরি করেছি। আমি যে তুলনা করেছিলাম তার চেয়ে নতুন ডেটাবেসকে আমি আপডেট করতে চেয়েছিলাম তার সাথে তুলনা করি। অবশেষে একটি মাইগ্রেশন স্ক্রিপ্ট উত্পন্ন হয়েছে, এবং আমি স্কিমা আপডেট করতে পারি।


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"

আমার ডাটাবেস তৈরি হয়েছিল, তবে মাইগ্রেশন ইতিহাসে কোনও রেকর্ড নেই।

আমি ডিবিও ব্যতীত সমস্ত টেবিল ফেলেছি __

অভিবাসন ইতিহাস খালি ছিল ory

চালান 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]

In. শেষ পর্যন্ত, মাইগ্রেশন তালিকার ব্যবস্থা ভিত্তিতে আবার আপডেট করার চেষ্টা করুন:

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

আশা করি এটি আপনার জন্য সহায়ক। ^^


0

আপনি প্যাকেজ ম্যানেজার কনসোলে "আপডেট-ডাটাবেস" কমান্ড চালানোর চেয়ে মাইগ্রেশন ফোল্ডারটি মুছে ফেলেছেন? যদি তাই

আপডেট-ডেটাবেস যদি চালিত হয় তার চেয়ে বেশি সমস্ত টেবিল ম্যানুয়ালি মুছুন তবে আপডেট-ডাটাবেস (কনস বীজ ডেটা মুছে ফেলা হবে)


0

এটি করার আরেকটি উপায় হ'ল আপ এবং ডাউন পদ্ধতিগুলির মধ্যে প্রারম্ভিক ক্লাসের সমস্ত কিছু hen


0

আমি একই সমস্যা ছিল। আমি নীচের সমাধানটির চেষ্টা করেছি: 1. আপ () থেকে টেবিল কোড এবং ডাউন () পদ্ধতি থেকে সম্পর্কিত কোড মুছে ফেলা হয়েছে ২. প্যাকেজ ম্যানেজার কনসোলে আপডেট-ডাটাবেস কমান্ড চালান

এটি আমার সমস্যার সমাধান করেছে


0

দ্রষ্টব্য: আমি এটি করেছি কারণ আমার ডাটাবেসে আমার কিছু নেই। আমার ক্ষেত্রে: 1. আমি হুকুমে একটি মাইগ্রেশন মুছে অপসারণ-মাইগ্রেশন মধ্যে প্যাকেজ ম্যানেজার কনসোল 2. 'SQL সার্ভার অবজেক্ট এক্সপ্লোরার' প্যানেল দ্বারা সরানো ডাটাবেসের> বর্তমান ডাটাবেসের> ডান-ক্লিক> এ সরান 3. মাইগ্রেট করা প্যাকেজ ম্যানেজার কনসোল লেখ যোগ -মাইগ্রেশন এবং এন্টার 4 ক্লিক করুন। কমান্ড আপডেট-ডাটাবেস দ্বারা শেষ আপডেট


0

একই কেস (সার্ভারে কোনও ডিবি এবং মাইগ্রেশনহিসটরি টেবিল নেই)। আমার পদক্ষেপগুলি:

  1. আমি আমার প্রথম স্থানান্তরের আপ এবং ডাউন বিভাগ থেকে মাইগ্রেশন ডেটা মুছে ফেলেছি।
  2. খালি স্থানান্তর সহ ডেটাবেস আপডেট করুন (মাইগ্রেশনহিসটরি টেবিলটি তৈরি করা হয়েছিল)
  3. এটির সাথে আপনার বাস্তব মাইগ্রেশন এবং আপডেট ডেটাবেস যুক্ত করুন।

0

ডাটাবেসে, ক্যোয়ারী __ মাইগ্রেশনহিসটরি টেবিল এবং অনুলিপি [কনটেক্সটকি]।

এটি নিচে DbMigrationsConfigration ConextKey এ আটকান

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

0

নীচের পদক্ষেপগুলি একই সমস্যার জন্য আমার পক্ষে কাজ করেছে:

দৃশ্যপট:

আমি ইমেল কার্যকারিতার জন্য আমার বিদ্যমান মডেলটিতে 2 টি নতুন ক্ষেত্র যুক্ত করার চেষ্টা করছিলাম। নতুন ক্ষেত্রগুলি হ'ল "ইসমাইল যাচাইকৃত" এবং "অ্যাক্টিভেশনকোড"

আমি যে পদক্ষেপগুলি অনুসরণ করেছি:

১. "মাইগ্রেশন" ফোল্ডারের অধীনে মুছে ফেলা পুরানো মাইগ্রেশন ফাইলগুলি যা আমাকে আপডেট-ডেটাবেস করতে বাধা দেয় ২ the মডেলটিতে আমার যে সমস্ত সাম্প্রতিক পরিবর্তনগুলি হয়েছে তা পুনরুদ্ধার করেছিলাম?

3. নীচের কমান্ড চালান:

অ্যাড-মাইগ্রেশন-সংযোগপ্রোভাডার নাম সিস্টেম.ডাটা.এসএকএলসিপ্লায়েন্ট-সংযোগ স্ট্রিং "ডেটা উত্স = ডেস্কটপ \ এসকিএএলএক্সপ্রেস; প্রাথমিক ক্যাটালগ = কাস্টম; স্থায়ী সুরক্ষা তথ্য = সত্য; ব্যবহারকারীর আইডি = সা; পাসওয়ার্ড = **** "

4. মাইগ্রেশন ফাইল থেকে আপ () এবং ডাউন () পদ্ধতিগুলি থেকে সামগ্রীগুলি মুছে ফেলেছে এবং পদ্ধতিগুলি খালি রেখে দিয়েছে

5. নীচের কমান্ড চালান:

আপডেট-ডাটাবেস-সংযোগপ্রোভাডার নাম সিস্টেম.ডাটা.এসএকএলসিপ্লায়েন্ট-সংযোগ স্ট্রিং "ডেটা উত্স = ডেস্কটপ \ এসকিএএলএক্সপ্রেস; প্রাথমিক ক্যাটালগ = কাস্টম; স্থায়ী সুরক্ষা তথ্য = সত্য; ব্যবহারকারীর আইডি = সা; পাসওয়ার্ড = " ***

  1. উপরের পদক্ষেপটি কার্যকর করার পরে, মডেল এবং ডিবি সিঙ্ক দেখায়।

  2. এখন, আমি মডেলটিতে নতুন বৈশিষ্ট্য যুক্ত করেছি

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. নীচের আদেশটি চালান:

অ্যাড-মাইগ্রেশন-সংযোগপ্রোভাইডারনম সিস্টেম.ডাটা.এসকিএলসিপ্লায়েন্ট-সংযোগ স্ট্রিং "ডেটা উত্স = ডেস্কটপ \ এসকিএএলএক্সপ্রেস; প্রাথমিক ক্যাটালগ = কাস্টম; স্থায়ী সুরক্ষা তথ্য = সত্য; ব্যবহারকারীর আইডি = সা; পাসওয়ার্ড = " ***

  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. নীচের কমান্ডটি চালান: আপডেট-ডেটাবেস-সংযোগপ্রবিডারনেম সিস্টেম.ডাটা.এসকিএলসিপ্লায়েন্ট-সংযোগস্ট্রিং "ডেটা উত্স = ডেস্কটপ \ স্ক্যালিএক্সপ্রেস; প্রাথমিক ক্যাটালগ = কাস্টম; স্থায়ী সুরক্ষা তথ্য = সত্য; ব্যবহারকারীর আইডি = সা; পাসওয়ার্ড = " ***

১১. এখন আমি অতিরিক্ত কলাম সহ সফলভাবে ডাটাবেস আপডেট করেছি।

সাম্প্রতিক পরিবর্তনগুলির পরে নীচে আপডেট টেবিলটি রয়েছে:

আপডেট স্থানান্তরের পরে সারণী


সত্যিই এটির প্রস্তাব করবেন না, প্রোডাক্টিন মাইগ্রেশন মুছে ফেলা আপনার পরিবেশকে ধ্বংস করবে। তারা যদি এতদিন কাজ করে তবে আপনার স্থানান্তরগুলি মুছতে হবে কেন? এবং আপনি সংযোগের স্ট্রিংগুলি এখানে প্রতিটি ব্যবহারকারীর পক্ষে কাজ করবে না, তাদের এ জাতীয় চালানো উচিত নয়
রাকুয়েনস

-5

মাইগ্রেশন ফাইলে সর্বজনীন ওভাররাইড শূন্য আপ () পদ্ধতিটি পরীক্ষা করে দেখুন । হতে পারে আপনি একটি নতুন ডিবি অবজেক্ট তৈরি করার চেষ্টা করছেন যা ইতিমধ্যে ডাটাবেসে রয়েছে। সুতরাং, db অবজেক্ট তৈরির আগে আপনাকে এই অবজেক্ট / টেবিলটি ফেলে দিতে হবে। ঠিক বেলো -

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

এবং এখন আপনার স্থানান্তর চালান Update-Database -TargetMigration: "2016_YourMigration"


6
আপনি যদি এটি করেন তবে আপনি আপনার সমস্ত ডেটা হারাবেন
মেহেদিওয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.