ASP.NET Core 2.0 में अपग्रेड करने के बाद माइग्रेशन बनाने में असमर्थ


109

ASP.NET Core 2.0 में अपग्रेड करने के बाद, मैं अब माइग्रेशन नहीं बना सकता।

मैं ला रहा हूँ

"क्लास 'प्रोग्राम पर' BuildWebHost 'को कॉल करते समय एक त्रुटि हुई। एप्लिकेशन सेवा प्रदाता के बिना जारी। त्रुटि: एक या एक से अधिक त्रुटियां हुईं। लॉगिन द्वारा अनुरोध नहीं किया जा सकता ..." लॉगिन विफल रहा। लॉगिन लॉग इन नहीं हुआ। " उपयोगकर्ता के लिए विफल ... '' "

तथा

"टाइप 'MyContext' का ऑब्जेक्ट बनाने में असमर्थ। प्रोजेक्ट में 'IDesignTimeDbContextFactory' का कार्यान्वयन जोड़ें, या डिज़ाइन समय पर समर्थित अतिरिक्त पैटर्न के लिए https://go.microsoft.com/fwlink/?linkid=851728 देखें ।"

पहले जो कमांड मैंने चलाया था, वह $ dotnet ef migrations add InitialCreate --startup-project "..\Web"(DBContext के साथ प्रोजेक्ट / फ़ोल्डर से) था।

संबंध तार: "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"

यह मेरा Program.cs है

 public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
       WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>()
           .Build();
}

3
संभवतः समस्या Program.cs में नहीं है। यह संभवतः आपके कॉन्फ़िगर विधि के अंत में बीज डेटा लोड करने के लिए एक निर्देश का उपयोग है: DbInitializer.Initialize (संदर्भ); यदि आपके पास वह निर्देश है, तो टिप्पणी करें: //DbInitializer.Initialize(context); फिर परीक्षण करने के लिए माइग्रेशन निर्देश चलाएँ। यदि समस्या उत्पन्न होती है, तो DbInitializer.cs वर्ग का अनुसरण करें।
मिगुएल टॉरेस C

1
क्या आपका MyContext क्लास की किसी अन्य लाइब्रेरी प्रोजेक्ट में है?
ओरुं

यहाँ एक ही मुद्दा, संदर्भ अन्य पुस्तकालय में है। अगर आईडी संदर्भ के लिए एक पैरामीटर कम कांस्ट्रक्टर को जोड़ता है, तो माइग्रेशन काम कर रहे हैं, लेकिन एक ही त्रुटि के साथ: (क्लास 'प्रोग्राम' पर 'BuildWebHost' कॉलिंग विधि के दौरान एक त्रुटि हुई। एप्लिकेशन सेवा प्रदाता के बिना जारी है। त्रुटि: ऑब्जेक्ट सेट नहीं है। किसी वस्तु की एक आवृत्ति।)
iBoonZ

क्या आप इसे अंत में हल कर पाए?
बजे कोनराड विल्टरनस्ट

उस टिप्पणी के लिए @MiguelTorresC धन्यवाद। मैंने अपनी सीडिंग विधियों पर टिप्पणी की और माइग्रेशन फिर से काम करने लगा। अनेक अनेक धन्यवाद !!!
अमित फिलिप्स

जवाबों:


123

आप एक वर्ग जोड़ सकते हैं जो आपके वेब प्रोजेक्ट के अंदर IDesignTimeDbContextFactory को लागू करता है।

यहाँ नमूना कोड है:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<CodingBlastDbContext>
{
    public CodingBlastDbContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
        var builder = new DbContextOptionsBuilder<CodingBlastDbContext>();
        var connectionString = configuration.GetConnectionString("DefaultConnection");
        builder.UseSqlServer(connectionString);
        return new CodingBlastDbContext(builder.Options);
    }
}

उसके बाद, अपने डेटाबेस प्रोजेक्ट पर जाएँ और कमांड लाइन से निम्नलिखित को चलाएँ:

dotnet ef migrations add InitialMigration -s ../Web/

dotnet ef database update -s ../Web/

-s stands for startup project and ../Web/ is the location of my web/startup project.

संसाधन


2
मुझे मिल रहा है: कॉन्फ़िगरेशन फ़ाइल 'appsettings.json' नहीं मिली और वैकल्पिक नहीं है। भौतिक पथ 'C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json' है। मेरी एप्लेटिंग C: \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api में है।
reft

सुनिश्चित करें कि आपके पास appsettings.json फ़ाइल है जिसे स्थानीय कॉपी करने के लिए सेट किया जाना चाहिए ताकि इसे ठीक न किया जा सके
DaImTo

1
यह समाधान आपके होस्ट एप्लिकेशन में एंटिटी फ्रेमवर्क पर निर्भरता का परिचय देता है (मेरे मामले में यह एक वेब परियोजना है)। क्या इसके आसपास पाने के लिए कोई रास्ता नहीं है? मैं अपनी रिपॉजिटरी लाइब्रेरी को EF सामान रखना चाहता हूँ, और EF को वेब ऐप में शामिल नहीं करना चाहता।
बनूना

इस स्वीकृत उत्तर के बावजूद, यह एक बेहतर है: stackoverflow.com/a/52671330/1737395 वास्तव में, --verbose ध्वज के साथ माइग्रेशन चलाने से बहुत मदद मिलती है
barbara.post

73

की कोई जरूरत नहीं IDesignTimeDbContextFactory

Daud

add-migration initial -verbose

के तहत विवरण प्रकट करेगा

कक्षा 'प्रोग्राम' पर IWebHost एक्सेस करते समय एक त्रुटि हुई। अनुप्रयोग सेवा प्रदाता के बिना जारी है।

चेतावनी, जो समस्या का मूल कारण है।

मेरे मामले में , समस्या थी, होने ApplicationRole : IdentityRole<int>और लागू services.AddIdentity<ApplicationUser, IdentityRole>()जो त्रुटि नीचे पैदा कर रहा था

System.ArgumentException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,
TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type 'TRole'.
---> System.TypeLoadException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.UserStoreBase`8[TUser,TRole,TKey,TUserClaim,
TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type parameter 'TRole'.

3
हाँ -Verbose वास्तव में वास्तविक समस्या को उजागर करने में मदद करता है। मेरे मामले में स्टार्टअप में AddDbContext सेवाओं को नहीं जोड़ा गया है।
sudhakarssd

3
डॉटनेट एफएफ़ माइग्रेशन में इनिशियलक्रीट --verbose
barbara.post

4
@tchelidze इसके लिए धन्यवाद, मेरे मामले में मेरे ApplicationDbContext में एक पैरामीटर रहित निर्माता नहीं था।
तियागो

1
यह एक शानदार टिप है, स्वीकृत उत्तर होना चाहिए
एवरहोम यिसरेल

1
बहुत बहुत धन्यवाद, इससे मुझे अपनी समस्या का पता लगाने और हल करने में मदद मिली। मेरे मामले में, यह "Data.Access.DAL.MainDbCbtetext 'प्रकार के लिए परिभाषित" कोई पैरामीटर रहित कंस्ट्रक्टर नहीं था। "
सारा

25

समाधान 1: (99% मामलों में समस्या का पता लगाएं)

वेब प्रोजेक्ट प्रोजेक्ट को स्टार्टअप प्रोजेक्ट के रूप में सेट करें

-verboseविकल्प के साथ निम्नलिखित कमांड चलाएँ ।

Add-Migration Init -Verbose

-verbose विकल्प वास्तव में वास्तविक समस्या को उजागर करने में मदद करता है, इसमें विस्तृत त्रुटियां हैं।

समाधान 2:

नाम बदलें BuildWebHost()करने के लिए CreateWebHostBuilder()है, क्योंकि Entity Framework Core toolsएक पाने की उम्मीद CreateHostBuilderविधि है कि कॉन्फ़िगर एप्लिकेशन चलने के बिना मेजबान।

.NET कोर 2.2

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
} 

.NET कोर 3.1

नाम बदलें BuildWebHost()करने के लिएCreateHostBuilder()

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

समाधान 3:

सुनिश्चित करें कि आपने Dbcontextनिर्भरता इंजेक्शन में जोड़ा है: AddDbContext<TContext>आपके DbContext दोनों प्रकार के TContext, और DbContextOptions<TContext>सर्विस कंटेनर से इंजेक्शन के लिए उपलब्ध उपलब्ध कराएगा । यह आपके DbContextप्रकार के लिए एक निर्माता तर्क जोड़ने की आवश्यकता है जो स्वीकार करता है DbContextOptions<TContext>

उदाहरण: Startup.cs में

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
}

AppDbContext कोड:

public class AppDbContext: DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
      :base(options)
    { }

}

1
इसने मेरे लिए काम किया। से Program.cs में BuildWebHost समारोह बदल दिया public static IWebHostBuilder BuildWebHost(string[] args)करने public static IWebHost BuildWebHost(string[] args)के साथ .Build()अब समारोह में शामिल
zola25

1
दोस्तों, यदि आप ASP.NET Core 2.1+ का उपयोग कर रहे हैं, तो आप BuildWebHost विधि का एक अलग नाम होगा - CreateWebHostBuilder क्योंकि docs.microsoft.com/en-us/aspnet/core/migration/… के कारण CreateWebHostBuilder को BuildWebHost और माइग्रेशन में बदल दिया जाएगा। BuildWebHost और इसमें से DbContext लें।
केईएमबीएल

2
धन्यवाद दोस्त, उपयोग करने के बिना कॉन्फ़िगर करने के लिए 2 घंटे बिताने के बाद हल कियाIDesignTimeDbContextFactory
अज़री ज़कारिया

3
"-Verbose" ध्वज के लिए धन्यवाद। इससे मुझे अपवाद के मूल कारण का पता लगाने में मदद मिली।
सेर्गेई_

21
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
}

बस नाम बदलने BuildWebHost()के लिए CreateWebHostBuilder(), क्योंकि माइग्रेशन डिफ़ॉल्ट रूप से इस पद्धति का उपयोग।


4
क्या। यह इस मुद्दे से निपटने वाले हर पृष्ठ पर विज्ञापित होना चाहिए, क्या आप गंभीर हैं । तुरन्त सफलता। धन्यवाद।
चैम एलियाह

मेरा दिन बचाओ !!! बहुत अजीब त्रुटि है। I का उपयोग कर रहा हूँ .net कोर 3.0 पूर्वावलोकन 7 के साथ और यह त्रुटि stil मौजूद है
D Todorov

@ डोडोरोव ने इस devblogs.microsoft.com/dotnet/…
शेरॉक्स

डी टोडोरोव बिल्ड नेमवॉस्ट () टू क्रिएटहोस्टबर्ल ()
अली

1
@WernerCD Cuz कार्यकर्ता CreateHostBuilder () विधि का उपयोग करता है जो नेट कोर 3 के IHostBuilder को लागू करता है
sherox

11

मेरे मामले में, समस्या का कारण कई स्टार्टअप परियोजनाएं थीं। मेरे समाधान में मेरी तीन परियोजनाएँ हैं: Mvc, Api, और Dal। डबकोनटेक्स्ट और माइग्रेशन इन द डल प्रोजेक्ट।

मैंने कई स्टार्टअप प्रोजेक्ट कॉन्फ़िगर किए थे। जब मैंने क्लिक किया तो Mvc और Api दोनों प्रोजेक्ट चल रहे थे। लेकिन इस मामले में मुझे यह त्रुटि मिल रही थी।

"टाइप 'MyContext' का ऑब्जेक्ट बनाने में असमर्थ। प्रोजेक्ट में 'IDesignTimeDbContextFactory' का कार्यान्वयन जोड़ें, या डिज़ाइन समय पर समर्थित अतिरिक्त पैटर्न के लिए https://go.microsoft.com/fwlink/?linkid=851728 देखें ।"

मैं Mvc को केवल स्टार्टअप प्रोजेक्ट के रूप में सेट करने और पैकेज मैनेजर कंसोल में दाल का चयन करने के बाद सफलतापूर्वक माइग्रेशन जोड़ सकता हूं।


1
धन्यवाद, मेरे साथ भी ऐसा ही हुआ। मुझे स्टार्टअप प्रोजेक्ट को उस स्थान पर बदलना पड़ा जहां स्टार्टअप / प्रोग्राम कक्षाएं मौजूद हैं। त्रुटि संदेश एक बुरा मजाक है।
लुबोस Čurgó

1
आउटपुट संदेश वास्तव में निराशाजनक थे। मेरे पास अनपेक्षित रूप से कोई स्टार्टअप परियोजना नहीं थी। यही कारण था कि dbContext नहीं बनाया जा सका। धन्यवाद।
1919

1
धन्यवाद सर जी ... मेरा बहुत समय बच गया है
नवीद खान

7

AppContext.cs के अलावा AppContext वर्ग में एक और वर्ग जोड़ें:

// required when local database deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<AppContext>();
          builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new AppContext(builder.Options);
    }
}

इससे आपकी दूसरी समस्या दूर हो जाएगी:

"प्रकार 'MyContext' का ऑब्जेक्ट बनाने में असमर्थ। प्रोजेक्ट में 'IDesignTimeDbContextFactory' का कार्यान्वयन जोड़ें।

उसके बाद आप प्रारंभ-माइग्रेशन जोड़ सकेंगे और अपडेट-डेटाबेस कमांड चलाकर इसे निष्पादित कर सकेंगे । हालाँकि, अगर आपके स्थानीय SqlServer में अभी तक कोई DataBase नहीं है, तो इन कमांड को चलाने पर आपको अपनी पहली त्रुटि की तरह चेतावनी मिलेगी: "एक त्रुटि

क्लास 'प्रोग्राम' पर 'BuildWebHost' कॉलिंग विधि के दौरान हुआ ... लॉगिन विफल रहा। उपयोगकर्ता '...' के लिए लॉगिन विफल हुआ

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


4

कृपया सत्यापित करें कि आपके पास संदर्भ है

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />

5
मैं उपयोग कर रहा हूं <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />जिसमें वह संदर्भ शामिल है। मैंने भी ऊपर सहित कोशिश की, लेकिन कोई बदलाव नहीं हुआ।
ruhm

4

आप इस चर्चा से इस समाधान की कोशिश कर सकते हैं , जो इस पोस्ट से प्रेरित था ।

public static IWebHost MigrateDatabase(this IWebHost webHost)
{
    using (var scope = webHost.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var db = services.GetRequiredService<MyContext>();
            db.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while migrating the database.");
        }
    }

    return webHost;
}
public static void Main(string[] args)
{
    BuildWebHost(args)
        .MigrateDatabase()
        .Run();
}

2
मैं अभी भी हो रही है: के एक कार्यान्वयन जोड़ें 'IDesignTimeDbContextFactory <DatabaseContext>' ......
reft

4

कुछ ऐसा है जो वास्तव में मेरी मदद करता है यह लेख था: https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesttimedbcontextfactory/

मूल विचार यह है कि .net core 1 से 2 के परिवर्तन में सभी db इनिशियलाइज़ेशन को StartUp.cs से बाहर और Program.cs में स्थानांतरित किया जाना चाहिए। अन्यथा कार्य करते समय EF कार्य आपके DB inits को आज़माते हैं और चलाते हैं।

"आधिकारिक माइग्रेशन डॉक्स ( https://docs.microsoft.com/en-us/ef/core/coreiscm1/1x-2x-upgrad ) में एक अच्छा खंड है " शीर्षक डेटाबेस इनिशियलाइज़ेशन कोड "शीर्षक जो मुझे लगता था याद किया। इसलिए इससे पहले कि आप किसी भी खरगोश के छेद को नीचे गिराएं जैसे मैंने यह सुनिश्चित किया कि यह वह नहीं है जिसके कारण आपको IdesignTimeDbContextFactory के कार्यान्वयन को जोड़ने की आवश्यकता है। "


धन्यवाद, इससे मुझे भी मदद मिली।
सर्गेई

3

से

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

जब आप एक नया ASP.NET Core 2.0 अनुप्रयोग बनाते हैं, तो यह हुक डिफ़ॉल्ट रूप से शामिल होता है। EF Core और ASP.NET Core के पिछले संस्करणों में, एप्लिकेशन के सेवा प्रदाता को प्राप्त करने के लिए उपकरण Startup.ConfigureServices को सीधे लागू करने का प्रयास करते हैं, लेकिन यह पैटर्न ASP.NET Core 2.0 अनुप्रयोगों में अब सही ढंग से काम नहीं करता है। यदि आप ASP.NET Core 1.x एप्लिकेशन को 2.0 में अपग्रेड कर रहे हैं, तो आप नए पैटर्न का पालन करने के लिए अपने प्रोग्राम क्लास को संशोधित कर सकते हैं।

.Net Core 2.x में Factory जोड़ें

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
    {
        public BloggingContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new BloggingContext(optionsBuilder.Options);
        }
    }

3

मुझे यह समस्या थी और इसे सेट द्वारा हल किया गया -> वेब अनुप्रयोग (शामिल Program.cs) प्रोजेक्ट -> "स्टार्टअप प्रोजेक्ट के रूप में सेट करें"

फिर रन -> ऐड-माइग्रेशन इनिशियल -वरबोज

पैकेज मैनेजर कंसोल में

स्टार्टअप प्रोजेक्ट के रूप में सेट


धन्यवाद, मेरे लिए काम करने वाला एकमात्र समाधान वेब प्रोजेक्ट को स्टार्टअप प्रोजेक्ट के रूप में स्थापित करना था और ठीक वैसा ही होना चाहिए।
user3012760

3

यदि आप उन IDesignTimeDbContextFactory चीज से बचना चाहते हैं: बस यह सुनिश्चित कर लें कि आप अपने स्टार्टअप में किसी बीज विधि का उपयोग नहीं करते हैं। मैं अपने स्टार्टअप में एक स्थिर बीज विधि का उपयोग कर रहा था और यह मेरे लिए यह त्रुटि पैदा कर रहा था।


2

पहले, आपने Startup.cs में कॉन्फ़िगर विधि में बीज डेटा को कॉन्फ़िगर किया था। अब यह अनुशंसा की जाती है कि आप केवल अनुरोध पाइपलाइन को सेट करने के लिए कॉन्फ़िगर विधि का उपयोग करें। एप्लिकेशन स्टार्टअप कोड मुख्य विधि में है।

Refactored मुख्य विधि। Program.cs में निम्न संदर्भ जोड़ें:

Microsoft.Extensions.D dependencyInjection का उपयोग कर;

MyProject.MyDbContextFolder का उपयोग;

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<MyDbConext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}



2

मेरे मामले में मुझे समस्या इसलिए हुई क्योंकि मेरे पास SeedData.EnsurePopulated () नाम की एक विधि थी, जो मेरे स्टार्टअप फ़ाइल पर कॉल की जा रही थी ।

public class Startup
{
    public Startup(IConfiguration configuration) => Configuration = configuration;
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        //
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            //
        });

        SeedData.EnsurePopulated(app);
    }
}

SeedData वर्ग का कार्य डेटाबेस तालिका में प्रारंभिक डेटा जोड़ना है। यह कोड है:

public static void EnsurePopulated(IApplicationBuilder app)
    {
        ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        context.Database.Migrate();
        if (!context.Products.Any())
        {
            context.Products.AddRange(
            new Product
            {
                Name = "Kayak",
                Description = "A boat for one person",
                Category = "Watersports",
                Price = 275
            },
            ....
            );
            context.SaveChanges();
        }
    }

उपाय

माइग्रेशन करने से पहले Startup.cs फ़ाइल में SeedData वर्ग को कॉल करने की टिप्पणी करें ।

// SeedData.EnsurePopulated(app);

इससे मेरी समस्या हल हो गई और आशा है कि आपकी समस्या भी उसी तरह हल हो जाएगी।


1

मैं उसी समस्या में भाग गया। समाधान में मेरी दो परियोजनाएँ हैं। कौन कौन से

  1. एपीआई
  2. सेवा और रेपो, जो संदर्भ मॉडल रखते हैं

प्रारंभ में, एपीआई परियोजना को स्टार्टअप परियोजना के रूप में सेट किया गया था।

मैंने स्टार्टअप प्रोजेक्ट को उसी में बदल दिया, जो संदर्भ वर्ग रखता है। यदि आप विज़ुअल स्टूडियो का उपयोग कर रहे हैं, तो आप प्रोजेक्ट को स्टार्टअप प्रोजेक्ट के रूप में सेट कर सकते हैं:

ओपन सॉल्यूशन एक्सप्लोरर >> रेफरेंस प्रोजेक्ट पर राइट-क्लिक करें >> सेट को स्टार्टअप प्रोजेक्ट के रूप में चुनें


1

सबसे पहले सुनिश्चित करें कि आपने अपने डेटाबेस को कॉन्फ़िगर किया है Startup.cs मेरे मामले में, मुझे यह त्रुटि मिल रही थी क्योंकि मैंने नीचे में निर्दिष्ट नहीं किया थाStartup.cs

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));

1

ASP.NET Core 3.1 और EntityFrameWorkCore 3.1.0 का उपयोग करना। केवल एक पैरामीटर रहित कंस्ट्रक्टर के साथ संदर्भ वर्ग के ऑनकोनफिगरिंग को ओवरराइड करना

```protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .Build();
            var connectionString = configuration.GetConnectionString("LibraryConnection");
            optionsBuilder.UseSqlServer(connectionString);
        }
    }
```

1

मैं त्रुटि का सामना कर रहा था

"टाइप 'MyContext' का ऑब्जेक्ट बनाने में असमर्थ। प्रोजेक्ट में 'IDesignTimeDbContextFactory' का कार्यान्वयन जोड़ें, या डिज़ाइन समय पर समर्थित अतिरिक्त पैटर्न के लिए https://go.microsoft.com/fwlink/?linkid=851728 देखें ।"

इस तरह मेरी समस्या हल हो गई। जब आप अपनी समाधान निर्देशिका में हों, तो नीचे दी गई कमांड चलाएँ

 dotnet ef migrations add InitialMigration --project "Blog.Infrastructure" --startup-project "Blog.Appication"

यहां एप्लिकेशन मेरा स्टार्टअप प्रोजेक्ट है जिसमें स्टार्टअप.क क्लास और इंफ्रास्ट्रक्चर है, जिसमें डीबोनटेक्स्ट क्लास वाला मेरा प्रोजेक्ट है।

फिर उसी संरचना का उपयोग करके अपडेट चलाएं।

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"

0

जब से मैं पुराने-Microsoft.EntityFrameworkCore.Tools.DotNet का जिक्र कर रहा था, मुझे वही मुद्दा मिला

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />

नए संस्करण में अपग्रेड करने के बाद इसका समाधान हो गया


0

मुख्य परियोजना के appsettings.json फ़ाइल में, मैंने "कॉपी आउटपुट टू डायरेक्टरी" को "हमेशा कॉपी करें" पर सेट किया था और यह काम किया।


0

.Net कोर कंसोल अनुप्रयोगों के लिए नमूना DB संदर्भ वर्ग

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace EmailServerConsole.Data
{
    public class EmailDBContext : DbContext
    {
        public EmailDBContext(DbContextOptions<EmailDBContext> options) : base(options) { }
        public DbSet<EmailQueue> EmailsQueue { get; set; }
    }

    public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<EmailDBContext>
    {
        EmailDBContext IDesignTimeDbContextFactory<EmailDBContext>.CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<EmailDBContext>();
            var connectionString = configuration.GetConnectionString("connection_string");
            builder.UseSqlServer(connectionString);
            return new EmailDBContext(builder.Options);
        }
    }
}

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

0

कॉन्फ़िगरेशन के लिए json फ़ाइल (जहाँ कनेक्शन स्ट्रिंग निहित है) को जोड़ने के लिए आप स्टार्टअप क्लास कंस्ट्रक्टर में भी उपयोग कर सकते हैं। उदाहरण:

    IConfigurationRoot _config;
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json");

        _config = builder.Build();
    }

0

मेरे लिए यह क्योंकि मैं बदल गया Output Typeसे मेरी स्टार्टअप परियोजना के Console Applicationलिए Class Library

टालमटोल करने पर उतारू हो Console Applicationगया।


0

मेरे पास एक समाधान में यह मुद्दा था:

  • .NET कोर 2.2 MVC प्रोजेक्ट
  • .NET कोर 3.0 ब्लेज़र प्रोजेक्ट
  • .NET मानक 2.0 क्लास लाइब्रेरी प्रोजेक्ट में DB संदर्भ

मुझे "ऑब्जेक्ट बनाने में असमर्थ ..." संदेश मिलता है जब ब्लेज़र परियोजना स्टार्ट अप प्रोजेक्ट के रूप में सेट की जाती है, लेकिन अगर एमवीसी प्रोजेक्ट स्टार्टअप प्रोजेक्ट के रूप में सेट नहीं किया गया है।

वह पहेली मुझे, क्योंकि पैकेज मैनेजर कंसोल में (जो कि मैं माइग्रेशन का निर्माण कर रहा हूं) मेरे पास सी # क्लास लाइब्रेरी के लिए डिफ़ॉल्ट प्रोजेक्ट सेट है जिसमें वास्तव में डीबी संदर्भ शामिल है, और मैं डीबी संदर्भ को भी निर्दिष्ट कर रहा हूं। ऐड-माइग्रेशन के लिए मेरा कॉल add-migration MigrationName -context ContextName, तो यह अजीब लगता है कि विज़ुअल स्टूडियो को इस बात की परवाह है कि वर्तमान में स्टार्टअप प्रोजेक्ट क्या है।

मैं कारण का अनुमान लगा रहा हूँ कि जब ब्लेज़र परियोजना स्टार्टअप प्रोजेक्ट है तो पीएमसी स्टार्टअप प्रोजेक्ट से कोर 3.0 होने के लिए .NET का संस्करण निर्धारित कर रहा है और तब .NET मानक 2.0 वर्ग पर माइग्रेशन चलाने के लिए उपयोग करने की कोशिश कर रहा है पुस्तकालय और किसी प्रकार का टकराव।

कारण जो भी हो, ब्लेज़र परियोजना के बजाय कोर 2.2 को लक्षित करने वाली एमवीसी परियोजना के लिए स्टार्टअप परियोजना को बदलना, इस मुद्दे को तय किया


0

मेरे लिए समस्या यह थी कि मैं गलत प्रॉजेक्ट के अंदर माइग्रेशन कमांड चला रहा था। DbContext सम्‍मिलित प्रोजेक्ट के बजाय उस प्रोजेक्ट के अंदर कमांड्स चलाना, जिसमें स्टार्टअप शामिल हैं।


0

मेरे मामले में इनिट में स्टार्टअप प्रोजेक्ट सेट करना मदद करता है। आप इसे निष्पादित करके कर सकते हैं

dotnet ef migrations add init -s ../StartUpProjectName

-4

मुझे भी यही समस्या थी। बस ap.jason को application.jason में बदल दिया और इसने समस्या को ठीक कर दिया

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