डेटाबेस में पहले से ही एक ऑब्जेक्ट नामित है


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)
    {

    }
}

मेरा 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> 

मैं इसे कैसे कर सकता हूं (मौजूदा डिजाइन के लिए मैपिंग)?
रूहुल्लाह अल्लेम

15
@HLGEM, यदि "अच्छी तरह से डिज़ाइन किया गया डेटाबेस" EF की तुलना में EF का उपयोग करके ऑब्जेक्ट मॉडल पर मैप किया जा सकता है, तो यह भी उत्पन्न करने में सक्षम है। DB माइग्रेशन एक शक्तिशाली उपकरण है जो आपके डेटा बेस की तैनाती को आसान बनाता है। मैं डीबी माइग्रेशन के उपयोग से बचने की सलाह नहीं दूंगा। अन्यथा पैच स्क्रिप्ट की जरूरत वैसे भी होती है। मैं डीबी माइग्रेशन का सही उपयोग करने की सलाह दूंगा।
इल्या पाल्किन

जवाबों:


129

ऐसा लगता है कि माइग्रेशन प्रक्रिया में कोई समस्या है, "पैकेज मैनेजर कंसोल" में ऐड-माइग्रेशन कमांड चलाएँ:

ऐड-माइग्रेशन इनिशिएटिव -IgnoreChanges

कुछ परिवर्तन करें, और फिर "प्रारंभिक" फ़ाइल से डेटाबेस अपडेट करें:

अद्यतन-डेटाबेस -verbose

संपादित करें: -IgnoreChanges EF6 में है, लेकिन EF कोर में नहीं, यहाँ एक समाधान है: https://stackoverflow.com/a/43687656/495455


8
यह वास्तव में क्या करता है? क्या यह नए मॉडल को पुराने को अधिलेखित करने की अनुमति देता है?
ट्रैविस ट्यूब्स

1
मैंने मैन्युअल माइग्रेशन का उपयोग करना शुरू कर दिया क्योंकि मैं अपने डेटाबेस में दृश्य के साथ-साथ टेबल्स का भी उपयोग करता हूं। मैंने स्वचालित माइग्रेशन का उपयोग करने की कोशिश की गलती की और परिणामस्वरूप यह एक दृश्य से एक तालिका बनाने की कोशिश कर रहा था। इस परिदृश्य में आपका समाधान काम नहीं करता है, मुझे इसके बजाय हमेशा मैनुअल माइग्रेशन का उपयोग करना चाहिए। इसलिए ऐसा करने के बाद मुझे स्रोत नियंत्रण में परिवर्तनों को पूर्ववत करना पड़ा और _Migrations तालिका से "प्रारंभिक" प्रविष्टि को हटा दिया।
arame3333

3
यह सिर्फ मुझे एक अनंत लूप में ले जाता है: पैकेज मैनेजर कंसोल मुझे ऐड-माइग्रेशन नहीं करने देगा क्योंकि यह "एक स्पष्ट माइग्रेशन उत्पन्न करने में असमर्थ है क्योंकि निम्न स्पष्ट माइग्रेशन लंबित हैं ..." अर्थात् प्रारंभिक। लेकिन अगर मैं सफलतापूर्वक उस Update-Database UNTIL को नहीं चला सकता हूँ तो कुछ Initial -IgnoreChanges भी हैं, तो मैं क्या करने वाला हूँ ??
ईस्ट ऑफ

6
ऐड-माइग्रेशन: ऐसा पैरामीटर नहीं खोजा जा सकता जो पैरामीटर नाम 'इग्नोरचेंज' से मेल खाता हो।
तज़्वी ग्रेगरी कैदानोव

3
@TravisTubbs आपके द्वारा किए गए परिवर्तनों और "नकली" को अनदेखा करता है, जो आपके मॉडल को db के साथ समन्वयित करता है, माइग्रेशन टेबल के संबंध में। आपको अभी भी दो को मैन्युअल रूप से सिंक करने की आवश्यकता है; मेरे मामले में मैंने मॉडल में किए गए परिवर्तनों को हटा दिया, एक ऐड-माइग्रेशन किया, अपडेट-डेटाबेस करने से पहले अप / डाउन विधियों से सामग्री को हटा दिया - इससे मुझे ब्रेकिंग माइग्रेशन से पहले की स्थिति में वापस आ गया। फिर मैंने वास्तव में बदलावों को फिर से जोड़ दिया, ऐड-माइग्रेशन किया, और हमेशा की तरह अपडेट-डेटाबेस - इस बार सब कुछ सिंक हो गया
डेविड रेफेल

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());जो आपके DbContext में स्थिर कंस्ट्रक्टर में कॉल करना है ।

मुझे उम्मीद है कि आपकी समस्या ठीक हो जाएगी।


9
बहुत बढ़िया, हमारे पास यह मुद्दा था!
ओलिवियर रोमैंड

3
वास्तव में यही इस त्रुटि का असली कारण है। EF डेटाबेस बनाने की कोशिश कर रहा है क्योंकि यह नहीं पढ़ सकता है कि डेटाबेस पर लागू होने वाले माइग्रेशन नामस्थान अंतर के कारण होते हैं
UfukSURMEN

इस उत्तर के लिए धन्यवाद, मुझे बहुत मदद मिली, जैसा कि ओलिवियर रोमैंड ने कहा, मेरे पास यह मुद्दा बिल्कुल था!
एनरिक ए पिनेलो नोवेलो

मुझे नहीं पता था कि यह इस से संबंधित था, लेकिन किसी तरह MigrationHistoryटेबल के रिकॉर्ड को हटाने से भी मेरे लिए इसे ठीक नहीं किया गया ... इसलिए मैंने अपनी सभी टेबल को गिरा दिया और ईएफ को सभी को फिर से बना दिया, छोटे ऐप, कोई बिग्गी नहीं। ..लेकिन यह मेरे लिए तय है।
निकोल्स

यह विवरण के साथ सही उत्तर है, यह उल्लेख करने के लिए भी अच्छा है कि कभी-कभी गलत वर्तनी फ़ोल्डर नाम इस समस्या का कारण होगा।
H35am

17

"डेटाबेस में 'AboutUs' नाम का एक ऑब्जेक्ट पहले से ही है।"

यह अपवाद आपको बताता है कि किसी ने पहले ही डेटाबेस में 'AboutUs' नाम की एक वस्तु जोड़ दी है।

AutomaticMigrationsEnabled = true;डेटा बेस संस्करण आपके द्वारा इस मामले में नियंत्रित नहीं किए जाने के कारण इसका नेतृत्व कर सकते हैं। अप्रत्याशित माइग्रेशन से बचने के लिए और सुनिश्चित करें कि टीम का प्रत्येक डेवलपर उसी डेटा बेस संरचना के साथ काम करता है जो मैं आपको सेट करने का सुझाव देता हूंAutomaticMigrationsEnabled = false;

स्वचालित माइग्रेशन और कोडित माइग्रेशन साथ-साथ रह सकते हैं यदि आप बहुत सावधान हैं और एक परियोजना पर केवल एक डेवलपर है।

डेटा डेवलपर केंद्र पर स्वचालित कोड प्रथम माइग्रेशन पोस्ट से एक उद्धरण है :

स्वचालित माइग्रेशन आपको प्रत्येक बदलाव के लिए अपनी परियोजना में कोड फ़ाइल के बिना कोड फर्स्ट माइग्रेशन का उपयोग करने की अनुमति देता है। सभी परिवर्तनों को स्वचालित रूप से लागू नहीं किया जा सकता है - उदाहरण के लिए कॉलम का नाम कोड-आधारित माइग्रेशन के उपयोग की आवश्यकता है।

टीम वातावरण के लिए सिफारिश

आप स्वचालित और कोड-आधारित माइग्रेशनों को समाप्त कर सकते हैं लेकिन टीम विकास परिदृश्यों में यह अनुशंसित नहीं है। यदि आप डेवलपर्स की एक टीम का हिस्सा हैं जो स्रोत नियंत्रण का उपयोग करते हैं तो आपको या तो स्वचालित रूप से स्वचालित माइग्रेशन या विशुद्ध रूप से कोड-आधारित माइग्रेशन का उपयोग करना चाहिए। स्वचालित माइग्रेशन की सीमाओं को देखते हुए हम टीम के वातावरण में कोड-आधारित माइग्रेशन का उपयोग करने की सलाह देते हैं।


12

मेरे मामले में, मेरी EFMigrationsHistoryटेबल खाली कर दी गई थी (किसी तरह) और जब update-databaseमैं दौड़ने की कोशिश कर रहा था:

डेटाबेस में पहले से ही 'AspNetUsers' नाम की एक वस्तु है

तालिका को देखने के बाद इसे खाली कर दिया गया जिससे यह समझ में आया कि यह प्रारंभिक प्रवास को पुन: शुरू करने और तालिकाओं को फिर से बनाने की कोशिश कर रहा था।

इस समस्या को ठीक करने के लिए मैंने अपनी EFMigrationsHistoryतालिका में पंक्तियों को जोड़ा । प्रत्येक प्रवास के लिए 1 पंक्ति जिसे मैं जानता था कि डेटाबेस अप टू डेट था।

एक पंक्ति में 2 कॉलम होंगे: MigrationIdऔरProductVersion

MigrationIdआपकी माइग्रेशन फ़ाइल का नाम है। उदाहरण:20170628112345_Initial

ProductVersionएफएफ संस्करण आप चला रहे हैं। आप इसे Get-Packageपैकेज मैनेजर कंसोल में टाइप करके और अपने ef पैकेज की तलाश कर सकते हैं ।

आशा है कि यह किसी के लिए उपयोगी है।


1
आपने मॉडल कॉलम को कैसे आबाद किया?
सियारन

7

मेरे मामले में मैंने असेंबली को फिर से नामित किया था जिसमें कोड-प्रथम इकाई ढांचा मॉडल शामिल था। यद्यपि वास्तविक स्कीमा को बुलाया जाने वाले सभी माइग्रेशन टेबल पर नहीं बदला गया था

dbo.__MigrationHistory

पुराने विधानसभा नाम के आधार पर पहले से ही निष्पादित माइग्रेशन की एक सूची शामिल है । मैंने माइग्रेशन तालिका में पुराने नाम को नए और माइग्रेशन से मेल करने के लिए अपडेट किया और फिर दोबारा काम किया।


5

सुनिश्चित करें कि आपके समाधान स्टार्टअप प्रोजेक्ट की कॉन्फ़िगरेशन फ़ाइल में सही कनेक्शन है। या अद्यतन-डेटाबेस कमांड निष्पादित करते समय -StartUpProjectName पैरामीटर सेट करें। -StartUpProjectName पैरामीटर नाम कनेक्शन स्ट्रिंग्स के लिए उपयोग करने के लिए कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट करता है। यदि छोड़ा गया है, तो निर्दिष्ट प्रोजेक्ट की कॉन्फ़िगरेशन फ़ाइल का उपयोग किया जाता है।

यहां एफ़-माइग्रेशन कमांड संदर्भों के लिए एक लिंक है http://coding.abel.nu/2012/03/ef-migrations-command-rever/


इस जवाब ने मुझे मेरी गलती के लिए प्रेरित किया, मुझे बस स्टार्टअप प्रोजेक्ट के रूप में गलत प्रोजेक्ट मिला।
मार्टिन जोहानसन

मुझे इसी तरह की समस्या हो रही थी और इसने मेरे लिए इसे ठीक कर दिया।
जॉर्डनटीडीएन

3

मुझे वही समस्या थी और तीन घंटे के संघर्ष के बाद मुझे पता चला कि क्या चल रहा है

मेरे मामले में, जब मैं पहली बार up()विधि में माइग्रेट करना चाहता था , तो डिफ़ॉल्ट कोड पहले से मौजूद तालिकाओं को बनाना चाहता है, इसलिए मुझे आपके समान त्रुटि मिली

इसे हल करने के लिए, बस उन कोड को हटा दें और लिखना चाहते हैं कि आप चाहते हैं। उदाहरण के लिए, मैं एक कॉलम जोड़ना चाहता था ताकि मैं लिखूं

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

एक अच्छे उत्तर की तरह दिखता है, लेकिन आप अपनी वर्तनी की जांच करना चाहते हैं। आप कोड स्निपेट का उपयोग यह स्पष्ट करने के लिए भी कर सकते हैं कि अंतिम पंक्ति कोड है। यदि आप इससे सहायता चाहते हैं तो मुझे संदेश दें।
माइक पूले

धन्यवाद मैं आपकी मालिश कैसे कर सकता हूँ
arfa

1
कोड स्निपेट @arfa जोड़ने के लिए अच्छा किया गया। मालिश की कोई आवश्यकता नहीं है :)। यदि आप मुझे अपना संदेश @भेजना चाहते हैं तो टिप्पणी अनुभाग में मेरा उपयोगकर्ता नाम लिखें ।
माइक

3

नोट: अनुशंसित समाधान नहीं। लेकिन कुछ मामलों में जल्दी ठीक।

मेरे लिए, dbo._MigrationHistoryउत्पादन डेटाबेस में प्रकाशन प्रक्रिया के दौरान माइग्रेशन रिकॉर्ड छूट गए, लेकिन विकास डेटाबेस में सभी माइग्रेशन रिकॉर्ड थे।

यदि आप सुनिश्चित हैं कि उत्पादन डीबी में देव डीबी की तुलना में समान और नवीनतम स्कीमा है, तो उत्पादन डीबी के लिए सभी माइग्रेशन रिकॉर्ड की नकल करने से समस्या हल हो सकती है।

आप VisualStudio के साथ पूरी तरह से कर सकते हैं।

  1. 'SQL सर्वर ऑब्जेक्ट एक्सप्लोरर' पैनल खोलें> dbo._MigrationHistoryस्रोत में राइट-क्लिक करें तालिका (मेरे मामले में देव डीबी) डेटाबेस> "डेटा तुलना ..." मेनू पर क्लिक करें।
  2. फिर, डेटा तुलना विज़ार्ड पॉप अप हुआ, लक्ष्य डेटाबेस का चयन करें (मेरे मामले में उत्पादन db में) और अगला क्लिक करें।
  3. कुछ सेकंड बाद, यह केवल स्रोत डेटाबेस में कुछ रिकॉर्ड दिखाएगा। बस 'अद्यतन लक्ष्य' बटन पर क्लिक करें।
  4. ब्राउज़र में, ताज़ा करें बटन दबाएं और त्रुटि संदेश चला गया देखें।

ध्यान दें, फिर से, यह जटिल और गंभीर परियोजना में अनुशंसित नहीं है। इसका उपयोग केवल आप ASP.Net या EntityFramework सीखने के दौरान समस्या है।


1
इसने मेरे लिए काम किया। हालांकि यह दूसरा रास्ता था। मेरे उत्पादन db में __EFMigrationHistory के सभी रिकॉर्ड थे, जबकि देव db में जहां किसी तरह गायब थे (शुरुआती एक को छोड़कर)।
जेन्स मैंडर

1

Dbo_MigrationHistory तालिका से पंक्तियों को हटाएं या तालिका हटाएं और चलाएं

update-database -verbose

यह एक-एक करके आपकी परियोजना में सभी माइग्रेशन चलाएगा


1

मेरे मामले में, मुद्दा सीडर में था। मैं इसके भीतर _ctx.Database.EnsureCreated () कॉल कर रहा था और जहां तक ​​मैं समझता था, अपडेट डेटाबेस कमांड को सफलतापूर्वक निष्पादित किया गया है, लेकिन तब सीडर ने डेटाबेस "दूसरा" समय बनाने की कोशिश की।

कैसे पता करें:

  1. नट रन अपडेट करें, बस आवेदन शुरू करें और सुनिश्चित करें कि कॉल करें ()। डेटाबेस बनाया / अद्यतन किया जाएगा
  2. सीडर पर टिप्पणी करें या निकालें।

1

एक और धार-मामला ईएफ कोर परिदृश्य।

जाँचें कि आपके पास एक माइग्रेशन / YourNAMEContextModelSnapshot.cs फ़ाइल है।

जैसा कि विस्तृत है - https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

यदि आपने माइग्रेशन.cs फ़ाइलों को हटाकर अपने डेटाबेस को मैन्युअल रूप से फिर से बनाने की कोशिश की है, तो सावधान रहें कि आपकी Migrations / * ContextModelSnapshot.cs फ़ाइल अभी भी मौजूद है।

इसके बिना, आपके बाद के माइग्रेशन के पास कोई स्नैपशॉट नहीं है, जिस पर आवश्यक अंतर पैदा करने के लिए और आपकी नई माइग्रेशन फ़ाइलें ऐसी दिखेंगी जैसे कि वे सब कुछ फिर से खरोंच से बना रहे हैं, फिर आपको उपरोक्त तालिका त्रुटि मिल जाएगी।


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

बस कमांड अपडेट-माइग्रेशन -स्क्रिप्ट निष्पादित करें। यह नई * .sql स्क्रिप्ट उत्पन्न करता है जिसमें माइग्रेशन में शामिल सभी DB परिवर्तन शामिल हैं। कोड के अंत में कुछ इस तरह से कमांड डालते हैं: INSERT [dbo]। [__ माइग्रेशनहिस्टर] ([प्रवासन], [संदर्भ], [मॉडल], [ProductVersion]) आप बस यह सब INSERT और DB को सिंक्रनाइज़ कर सकते हैं।


0

कोई परिणाम नहीं मिलने के एक घंटे से अधिक समय के बाद मैंने माइग्रेशन का उपयोग नहीं करते हुए एक और दृष्टिकोण की कोशिश की, लेकिन मैंने एक स्कीमा तुलना की।

दृश्य स्टूडियो में -> उपकरण -> एसक्यूएल सर्वर -> नई स्कीमा तुलना

पहले मैंने 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

माइग्रेशनहिस्टर खाली था।

Daud 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

आपने पैकेज मैनेजर कंसोल पर "अपडेट-डेटाबेस" कमांड चलाने का प्रयास कर रहे हैं, तो आपने माइग्रेशन फ़ोल्डर हटा दिया है? यदि ऐसा है तो

अपडेट-डेटबसे (सही बीज डेटा हटा दिया जाएगा) तो बस मैन्युअल रूप से सभी टेबलों को हटा दें


0

ऐसा करने का एक और तरीका है, प्रारंभिक कक्षा में सब कुछ के बारे में टिप्पणी करना, ऊपर और नीचे के तरीके के बीच। जब अद्यतन रन-डेटाबेस, बीज विधि को चलाने के बाद फिर से अपडेट-डेटाबेस को चलाने में सफल रहा। शायद कुछ दोस्तों के लिए उपयोगी हो।


0

मैं उसी मुद्दे का सामना कर रहा था। मैंने नीचे समाधान की कोशिश की: 1. अप () और नीचे से संबंधित कोड से तालिका कोड हटा दिया (विधि) 2. पैकेज प्रबंधक में अद्यतन डेटाबेस आदेश चलाएँ

इससे मेरी समस्या हल हो गई


0

नोट: मैंने ऐसा इसलिए किया क्योंकि मेरे डेटाबेस में कुछ भी नहीं है। मेरे मामले में: 1. मैं कमांड द्वारा एक प्रवास हटाया निकालें-माइग्रेशन में पैकेज प्रबंधक कंसोल 2. 'SQL सर्वर ऑब्जेक्ट एक्सप्लोरर' पैनल से हटा दिया डेटाबेस> वर्तमान डेटाबेस> राइट क्लिक पर> में निकालें 3. माइग्रेट पैकेज प्रबंधक कंसोल लिखने जोड़ें माइग्रेशन और क्लिक करें Enter 4. कमांड अपडेट-डेटाबेस द्वारा अंतिम अपडेट


0

एक ही मामला (सर्वर पर कोई डीबी और माइग्रेशनहिस्टर टेबल)। मेरे कदम:

  1. मैंने अपने पहले माइग्रेशन के अप और डाउन सेक्शन से माइग्रेशन डेटा डिलीट कर दिया।
  2. खाली माइग्रेशन के साथ अद्यतन डेटाबेस (माइग्रेशनहिस्टर टेबल बनाया गया था)
  3. इसमें अपना REAL माइग्रेशन और डेटाबेस अपडेट करें।

0

डेटाबेस में, __MigrationHistory टेबल को क्वेरी करें और [ContextKey] को कॉपी करें।

इसे नीचे दिए गए DbMigrationsConfiguration ConextKey में पेस्ट करें

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

0

नीचे दिए गए चरणों ने मेरे लिए एक ही मुद्दे के लिए काम किया:

परिदृश्य:

मैं ईमेल कार्यक्षमता के लिए अपने मौजूदा मॉडल में 2 नए फ़ील्ड जोड़ने का प्रयास कर रहा था। नए क्षेत्र "IsEmailVerified" और "एक्टिवेशनकोड" हैं

जिन चरणों का मैंने अनुसरण किया है:

1. "माइग्रेशन" फ़ोल्डर के तहत पुराने माइग्रेशन फ़ाइलों को हटा दिया गया है जो मुझे अपडेट-डेटाबेस को करने से रोकते हैं 2. मेरे द्वारा हाल ही में किए गए सभी परिवर्तनों को बदला, जो मैंने मॉडल पर किए हैं

3. नीचे दिए गए आदेश पर:

ऐड-माइग्रेशन -ConnectionProviderName System.Data.SqlClient -ConnectionString "डेटा स्रोत = DESKTOP \ SQLEXPRESS; प्रारंभिक कैटलॉग = कस्टम; पर्सिस्टेंट सिक्योरिटी इन्फो = ट्रू; यूजर आईडी = सा? पासवर्ड = **** "

4. सामग्री को ऊपर () और नीचे () तरीकों से माइग्रेशन फ़ाइल से हटा दिया और विधियों को खाली छोड़ दिया

5. नीचे दिए गए आदेश पर:

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "डेटा स्रोत = DESKTOP \ SQLEXPRESS; आरंभिक कैटलॉग = कस्टम; सुरक्षा सुरक्षा जानकारी = सत्य; उपयोगकर्ता आईडी = सा? पासवर्ड = " ***

  1. उपरोक्त चरण को निष्पादित करने के बाद, मॉडल और DB सिंक दिखता है।

  2. अब, मैंने मॉडल में नए गुण जोड़े

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. नीचे कमांड चलाएँ:

ऐड-माइग्रेशन -ConnectionProviderName System.Data.SqlClient -ConnectionString "डेटा स्रोत = DESKTOP \ SQLEXPRESS; प्रारंभिक कैटलॉग = कस्टम; स्थायी सुरक्षा जानकारी = सत्य; उपयोगकर्ता आईडी = सा? पासवर्ड = " ***

  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. नीचे दिए गए कमांड को चलाएं: अपडेट-डेटाबेस -कॉन्नेक्शन ProviderName System.Data.SqlClient -ConnectionString "डेटा स्रोत = DESKTOP \ SQLEXPRESS; प्रारंभिक कैटलॉग = कस्टम; पर्सिस्टेंट सिक्योरिटी इन्फो = ट्रू; यूजर आईडी = सा? पासवर्ड = " ***

11.अब मैंने अतिरिक्त कॉलम के साथ डेटाबेस को सफलतापूर्वक अपडेट किया है।

हाल के परिवर्तनों के बाद नीचे दी गई अद्यतन तालिका है:

अपडेट माइग्रेशन के बाद तालिका


वास्तव में यह अनुशंसा नहीं करते हैं, प्रोडक्टिन माइग्रेशन को हटाने से केवल आपके environemnts को नष्ट कर दिया जाएगा। यदि आपने अभी तक काम किया है तो आपको अपने माइग्रेशन को क्यों हटाना पड़ेगा? और आप यहाँ हर उपयोगकर्ता के लिए तार तार नहीं करेंगे, उन्हें इस तरह नहीं चलाना चाहिए
rakuens

-5

माइग्रेशन फ़ाइल में सार्वजनिक ओवरराइड शून्य () विधि की जाँच करें । हो सकता है कि आप एक नई डीबी ऑब्जेक्ट बनाने की कोशिश कर रहे हैं जो पहले से ही डेटाबेस में है। तो, आपको db ऑब्जेक्ट के निर्माण से पहले इस ऑब्जेक्ट / टेबल को छोड़ने की आवश्यकता है। बस करो पसंद -

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

और अब अपना प्रवास चलाएं Update-Database -TargetMigration: "2016_YourMigration"


6
यदि आप ऐसा करते हैं तो आप अपना सारा डेटा खो देंगे
मेहदीवे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.