16

में प्रारंभिक डेटा बीज ऐसा लगता है कि एंटीटी फ्रेमवर्क 7 में बीज डेटा के लिए अभी तक कोई मूल समर्थन नहीं है (https://github.com/aspnet/EntityFramework/issues/629)।एंटिटी फ्रेमवर्क 7 आरसी 1 और एएसपी.नेट एमवीसी 6

माइक्रोसॉफ्ट द्वारा प्रदान किए गए टेम्पलेट कोड में DbMigrationsConfiguration कक्षा, Seed विधि नहीं है।

तो एएसपी.नेट एमवीसी 6 वेब अनुप्रयोग में बीज डेटा कैसे करें जो इकाई फ्रेमवर्क 7 आरसी 1 का उपयोग करता है?

+1

आप इस लेख देख सकते हैं एमएसडीएन ब्लॉग में: https://blogs.msdn.microsoft.com/dotnet/2016/09/29/implementing-seeding- कस्टम-conventions-and-interceptors-in-ef-core-1-0/ –

उत्तर

15

मुझे अपने लिए एक अस्थायी कामकाज मिला है।

हम एक विधि SeedData कि IApplicationBuilder फैली तो GetService विधि के माध्यम से हमारे डाटाबेस संदर्भ वर्ग का एक उदाहरण हो जाता है और डेटा बोने के लिए इसे इस्तेमाल करता है बना सकते हैं।

यहाँ कैसे अपने एक्सटेंशन विधि की तरह लग रहा है:

using Microsoft.AspNet.Builder; 
using Microsoft.Extensions.DependencyInjection; 

public static class DataSeeder 
{ 
    // TODO: Move this code when seed data is implemented in EF 7 

    /// <summary> 
    /// This is a workaround for missing seed data functionality in EF 7.0-rc1 
    /// More info: https://github.com/aspnet/EntityFramework/issues/629 
    /// </summary> 
    /// <param name="app"> 
    /// An instance that provides the mechanisms to get instance of the database context. 
    /// </param> 
    public static void SeedData(this IApplicationBuilder app) 
    { 
     var db = app.ApplicationServices.GetService<ApplicationDbContext>(); 

     // TODO: Add seed logic here 

     db.SaveChanges(); 
    } 
} 

यह (Startup.cs बुलाया फ़ाइल में वेब परियोजना में स्थित) आवेदन Startup वर्ग के Configure विधि में app.SeedData(); लाइन डाल का उपयोग करें।

// This method gets called by the runtime. 
// Use this method to configure the HTTP request pipeline. 
public void Configure(
    IApplicationBuilder app, 
    IHostingEnvironment env, 
    ILoggerFactory loggerFactory) 
{ 
    app.SeedData(); 

    // Other configuration code 
} 
2

मैं अपने Startup.cs में निजी Seed() विधि बनाया है लेकिन क्योंकि यह न केवल आवेदन स्टार्टअप के दौरान इस्तेमाल किया जा सकता मैं भी अपने दृष्टिकोण की तरह।

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    this.Seed(); 
} 

private void Seed() 
{ 
    using (var db = new MyDbContext()) 
    { 
     db.Database.Migrate(); 

     // Seed code 

     db.SaveChanges(); 
    } 
} 
6

एफई कोर RTM 1.0 और ASP.NET कोर आरटीएम 1,0

पहले के लिए बीज विधि पैदा करते हैं। यहाँ क्योंकि हम वर्तमान अनुरोध के दायरे से बाहर हैं, हम इसे manulally बनाना चाहिए:

using System.Collections.Generic; 
using System.Linq; 
using Core1RtmEmptyTest.Entities; 
using Microsoft.Extensions.DependencyInjection; 

namespace Core1RtmEmptyTest.Migrations 
{ 
    public static class ApplicationDbContextSeedData 
    { 
     public static void SeedData(this IServiceScopeFactory scopeFactory) 
     { 
      using (var serviceScope = scopeFactory.CreateScope()) 
      { 
       var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>(); 
       if (!context.Persons.Any()) 
       { 
        var persons = new List<Person> 
        { 
         new Person 
         { 
          FirstName = "Admin", 
          LastName = "User" 
         } 
        }; 
        context.AddRange(persons); 
        context.SaveChanges(); 
       } 
      } 

     } 
    } 
} 

फिर ApplicationDbContext

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<ApplicationDbContext>(ServiceLifetime.Scoped); 

की सही जीवन समय निर्दिष्ट और अंत में Configure से SeedData() विधि कॉल विधि

public void Configure(IServiceScopeFactory scopeFactory) 
{ 
    scopeFactory.SeedData(); 
1

आप एप्लिकेशन डीबीकॉन्टेक्स्ट के अंदर स्थैतिक बीज विधि बना सकते हैं और IAplicationBuilder को बराबर के रूप में पास कर सकते हैं ameter। फिर Startup.cs में इस विधि को कॉल करें।

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 
     : base(options) 
    { 
    } 


    public static void Seed(IApplicationBuilder applicationBuilder) 
    { 
     using (var context=applicationBuilder.ApplicationServices.GetRequiredService<ApplicationDbContext>()) 
     { 
      context.Database.EnsureDeleted(); 
      context.Database.EnsureCreated(); 
      for(int i = 1; i< 1000; i++) 
      { 
       context.Movies.Add(new Movie 
       { 
        Genre = "Action", 
        ReleaseDate =DateTime.Today, 
        Title = "Movie "+i 
       }); 
      } 
      context.SaveChanges(); 
     } 
    } 

    public DbSet<Movie> Movies { get; set; } 
} 

Startup.cs अंदर Configure() विधि में, EF/MVC intro से ApplicationDbContext.Seed(app)

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
      app.UseDatabaseErrorPage(); 
      app.UseBrowserLink(); 
     } 
     else 
     { 
      app.UseExceptionHandler("/Home/Error"); 
     } 

     app.UseStaticFiles(); 

     app.UseIdentity(); 


     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
     ApplicationDbContext.Seed(app); 
    } 
2

फोन, बस: Startup.Configure() *

  • में

    1. निर्भरता-इंजेक्षन अपने DbContext (नीचे SchoolContext) सीधे अपनापास करेंएक फ़ंक्शन (DbInitializer.Initialize नीचे) जो कुछ ऐसा करता है:
      1. सुनिश्चित करें कि डेटाबेस created or that it's migrated है; context.Database.EnsureCreated(); पर विचार context.Database.Migrate();
      2. रिटर्न अगर पहले से ही वरीयता प्राप्त if (context.Students.Any()) { return; }
      3. किसी और बीज context.Students.Add({...}); context.SaveChanges();

    यहाँ की तरह:

    public void Configure(..., ..., SchoolContext context) 
    { 
    
        ... 
        DbInitializer.Initialize(context); 
    } 
    

    ...

    public static class DbInitializer 
    { 
        public static void Initialize(SchoolContext context) 
        { 
         context.Database.EnsureCreated(); 
    
         // Look for any students. 
         if (context.Students.Any()) 
         { 
          return; // DB has been seeded 
         } 
    
         var students = new Student[] 
         { 
          new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")}, ... 
         }; 
         foreach (Student s in students) 
         { 
          context.Students.Add(s); 
         } 
         context.SaveChanges(); 
         ... 
    

    * निर्भरता-इंजेक्शन लगाने Startup.Configure() में क्यों मेरा उत्तर योग्य है (भले ही एक और जवाब पहले से ही स्वीकार किया जाता है।) है

    1. निर्भरता-इंजेक्शन लगाने के अपने Startup.Configure() में DbContextEF/MVC Intro
    2. में किया जाता है कोई अन्य जवाब यहाँ सिर्फ निर्भरता कॉन्फ़िगर करने में इंजेक्शन; वे या तो GetService() और/या GetRequiredService(), या एक नयाDbContext तत्काल करें। आपको उस कोड की आवश्यकता नहीं हो सकती है। फिर, यदि आप आवश्यकता हो सकती है कि ज्यादा कोड, (यानी अगर निर्भरता इंजेक्शन DbContext निपटारा किया गया था, which is where the GetService() is necessary to create a new Scope.। कृपया downvote/संपादित करें/टिप्पणी अगर मैंने कुछ गलत कर रहा हूँ के बारे में।
  • संबंधित मुद्दे