2016-06-26 36 views
9

Vấn đề của tôi là tôi đang cố gắng tạo một cơ sở dữ liệu lõi Entity Framework với dữ liệu và trong tâm trí của tôi, mã dưới đây hiển thị công việc. Tôi đã nhận ra rằng điều này không nên được gọi trong các nhà xây dựng ApplicationDbContext và nên được gọi từ startup nhưng im không chắc chắn làm thế nào để làm điều này.Cơ sở dữ liệu hạt nhân ASP.NET Core RC2

EDIT: Dựa trên các giải pháp được cung cấp bởi Ketrex, giải pháp của tôi là như sau:

Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     ... 

     app.ApplicationServices.GetRequiredService<ApplicationDbContext>().Seed(); 
    } 

Seed mở rộng:

public static class DbContextExtensions 
{ 
    public static void Seed(this ApplicationDbContext context) 
    { 
     // Perform database delete and create 
     context.Database.EnsureDeleted(); 
     context.Database.EnsureCreated(); 

     // Perform seed operations 
     AddCountries(context); 
     AddAreas(context); 
     AddGrades(context); 
     AddCrags(context); 
     AddClimbs(context); 

     // Save changes and release resources 
     context.SaveChanges(); 
     context.Dispose(); 
    } 

    private static void AddCountries(ApplicationDbContext context) 
    { 
     context.AddRange(
      new Country { Name = "England", Code = "En" }, 
      new Country { Name = "France", Code = "Fr" } 
      ); 
    } 

    ... 
} 

Tôi hiểu rằng gieo mầm cơ sở dữ liệu khá cao trong danh sách ưu tiên cho Entity Framework nhưng nó sẽ là tuyệt vời nếu có một số tài liệu về cách đạt được nhiệm vụ tầm thường này hoặc ít nhất cung cấp một công việc tạm thời tròn. Nếu ai đó có thể cung cấp một số hướng dẫn về cách làm điều này, nó sẽ được đánh giá cao. Tôi cảm thấy tôi gần gũi với một giải pháp nhưng không thể kết hợp nó lại với nhau.

Cảm ơn bạn đã được trợ giúp.

Trả lời

9

Giả sử bạn đang sử dụng bộ chứa DI tích hợp, dưới đây là một cách bạn có thể thực hiện việc này.

tham khảo phương pháp dòng dõi ngươi trong phương pháp Configure của lớp khởi động của bạn, và vượt qua các đối tượng IApplicationBuilder như một tham số thay vì DbContext, như thế này:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    //... 
    // Put this at the end of your configure method 
    DbContextSeedData.Seed(app); 
} 

Tiếp theo, thay đổi phương pháp dòng dõi ngươi phải chấp nhận IApplicationBuilder ví dụ. Sau đó, bạn sẽ có thể quay lên một thể hiện của các DbContext, và thực hiện thao tác dòng dõi ngươi, như thế này:

public static void Seed(IApplicationBuilder app) 
{ 
    // Get an instance of the DbContext from the DI container 
    using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>()) 
    { 
     // perform database delete 
     context.Database.EnsureDeleted; 
     //... perform other seed operations 
    } 
} 
+0

Cảm ơn bạn rất nhiều! Đó là dòng này 'app.ApplicationServices.GetRequiredService () 'mà tôi đã bỏ lỡ. Tôi đã sửa đổi giải pháp của bạn một chút để sử dụng nó như một phương pháp mở rộng. –

+0

vấn đề: context.Database.EnsureDeleted() xóa __EFMigrationsHistory cũng !!! –

+1

@MohammadAkbari bạn dường như đang hái trứng. Hãy chú ý đến số // ... thực hiện các hoạt động hạt giống khác ? Nó rõ ràng ngụ ý anh ta có thể có các hoạt động khác để thực hiện. Vấn đề được giải quyết ở đây là tiêm bối cảnh vào phương thức hạt giống. – Ketrex

2

Bạn cũng có thể sử dụng từ phương pháp Startup.cs ConfigureServices để làm ApplicationDbContext của bạn có sẵn (Đăng ký dbcontext như một dịch vụ):

public void ConfigureServices(IServiceCollection services) 
{ 
    var connectionString = Startup.Configuration["connectionStrings:DBConnectionString"];//this line is not that relevant, the most important thing is registering the DbContext 
      services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(connectionString)); 
} 

và sau đó thêm ApplicationDbContext của bạn càng phụ thuộc vào Configure phương pháp của bạn mà sẽ gọi phương thức mở rộng dòng dõi ngươi.

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

Cuối cùng phương pháp hạt giống có thể làm một kiểm tra nhanh chóng trên một bảng quan trọng, bởi vì có lẽ tái tạo lại db là quá nặng:

public void Seed() 
{ 
//....  
if(context.Countries.Any()) 
    return; 
//... 
} 

Tôi hy vọng nó sẽ giúp bạn hoặc người khác, ít nhất là như nhau Tùy chọn.

0

Nếu bạn muốn chạy mã EF từ một thư viện lớp riêng biệt và làm Seeding ở chỗ bạn có thể thực hiện các thao tác sau. Điều này đang sử dụng TSQL ...

1) Tạo thư viện lớp học mới. Thêm sự phụ thuộc sau đây với NuGet ...

Microsoft.AspNetCore 
Microsoft.AspNetCore.Identity.EntityFrameworkCore 
Microsoft.EntityFrameworkCore.SqlServer 
Microsoft.EntityFrameworkCore.Tools 

2) Chĩa Package Manager Console tại dự án này và chạy ...

PM> add-migration Seeder01 

sau đó ...

PM> update-database 

điều này cung cấp cho bạn di chuyển trống.

3) Script các bản cập nhật như một cái gì đó giống như ...

using Microsoft.EntityFrameworkCore; 
using Microsoft.EntityFrameworkCore.Migrations; 
using System; 
using System.Collections.Generic; 
using Microsoft.Extensions.Configuration; 
using System.IO; 

namespace Test02.Data.Migrations 
{ 
    public partial class Seeder01 : Migration 
    { 

     protected override void Up(MigrationBuilder migrationBuilder) 
     { 
      string sql = string.Empty; 

      sql = "SET IDENTITY_INSERT State ON;"; 
      sql += "Insert into State (Id, Name) values "; 
      sql += "(2, 'NSW'),"; 
      sql += "(3, 'VIC'),"; 
      sql += "(4, 'QLD'),"; 
      sql += "(5, 'SA')"; 
      sql += ";"; 
      sql += "SET IDENTITY_INSERT State OFF;"; 
      migrationBuilder.Sql(sql); 

     } 

     protected override void Down(MigrationBuilder migrationBuilder) 
     { 
      string sql = string.Empty; 
      sql = "delete State;"; 
      migrationBuilder.Sql(sql); 


     } 
    } 
} 

4) Hoàn nguyên để sự di cư trước với ...

PM> add-migration {PriorMigrationName} 

Nạp lại sự di cư giống và cập nhật cơ sở dữ liệu .. .

PM> add-migration Seeder01 
PM> update-database 
Các vấn đề liên quan