10

Cố gắng thêm di chuyển vào Mô hình EF7 nằm trong thư viện lớp ASP.NET 5. Khi chạy dnx . ef migration add mymigration không thành công với các kết quả khác nhau tùy thuộc vào dự án tôi chạy nó.Entity Framework 7 Giàn giáo di trú trong thư viện lớp học với cấu hình

Nếu tôi chạy nó trong thư mục của dự án chính, nó không thể định vị DbContext, điều này có ý nghĩa vì DbContext nằm trong dự án được chia sẻ và lệnh ef có thể không quan tâm đến các phụ thuộc.

Nếu tôi chạy nó trong thư mục của dự án được chia sẻ, nó không có quyền truy cập vào chuỗi kết nối được chỉ định trong startup.cs. Tôi đã lượm lặt từ các câu hỏi như this rằng nó hoạt động từ dự án được chia sẻ nếu bạn chỉ định chuỗi kết nối theo phương pháp OnConfiguring của DbContext nhưng tôi thực sự muốn giữ mã này tách biệt khỏi cấu hình.

Tôi bắt gặp một số issue logs trong kho EF7 đề cập đến các tùy chọn dòng lệnh để chỉ định dự án và ngữ cảnh nhưng không có ví dụ và tôi không thể tìm hiểu cách sử dụng nó lịch sử cam kết.

+0

Bạn đang lưu trữ chuỗi kết nối ở đâu? Có khó mã hóa vào Startup.cs không? –

+0

Nó nằm trong config.json và được nạp với Cấu hình vào AddDbContext CuddleBunny

Trả lời

9

Đây là một cách tiếp cận có thể phù hợp với bạn.

Nếu tôi chạy nó trong thư mục của dự án được chia sẻ, nó không có quyền truy cập vào chuỗi kết nối được chỉ định trong startup.cs.

Startup.cs

Tôi giả định rằng trong Startup.cs của bạn, bạn đang xác định chuỗi kết nối bằng cách truy cập Configuration chứ không phải bằng cứng mã hóa nó. Hơn nữa, tôi giả định rằng trong constructor của tệp Startup.cs, bạn đang thiết lập cấu hình từ một vài nguồn. Nói cách khác, Startup.cs của bạn có thể trông giống như thế này:

public class Startup 
{ 
    public IConfiguration Config { get; set; } 

    public Startup(IHostingEnvironment env) 
    { 
     var config = new Configuration() 
      .AddJsonFile("config.json") 
      .AddUserSecrets() 
      .AddEnvironmentVariables(); 

     Config = config; 
    } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<MyDbContext>(options => 
      { 
       options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]); 
      }); 
    } 

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) 
    { 
     var db = serviceProvider.GetRequiredService<MyDbContext>(); 
     db.Database.AsSqlServer().EnsureCreated(); 

     app.Run(async (context) => 
     { 
      await context.Response.WriteAsync("Hello World!"); 
     }); 
    } 
} 

config.json

Hơn nữa, tôi giả định rằng bạn đang thêm chuỗi kết nối đến một config.json trong thư mục gốc dự án của bạn (hoặc bạn thêm nó qua bí mật người dùng hoặc các biến môi trường.) config.json của bạn có thể trông giống như thế này:

{ 
    "ConnectionStrings": { 
    "MyDbContext": "Some-Connection-String" 
    } 
} 

Nếu bạn không thực hiện nó theo cách đó, nó có thể là giá trị cố gắng nó .

Tôi đã thu thập từ các câu hỏi như thế này rằng nó hoạt động từ dự án được chia sẻ nếu bạn chỉ định chuỗi kết nối trong phương pháp OnConfiguring của DbContext nhưng tôi thực sự muốn giữ mã này tách biệt với cấu hình.

DbContext

Nếu giả định của tôi ở trên là chính xác, sau đó bạn có thể truy cập vào chuỗi kết nối trong DbContext bằng cách sử dụng cùng một khuôn mẫu mà bạn sử dụng trong lớp Startup. Đó là, trong các nhà xây dựng DbContext, thiết lập các IConfiguration. Sau đó, trong OnConfiguring, truy cập chuỗi kết nối.Nó có thể giống như thế này:

public class MyDbContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     builder.Entity<SomeModel>().Key(e => e.Id); 
     base.OnModelCreating(builder); 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     var connString = Config["ConnectionStrings:MyDbContext"]; 
     optionsBuilder.UseSqlServer(connString); 
    } 

    public IConfiguration Config { get; set; } 

    public MyDbContext() 
    { 
     var config = new Configuration() 
      .AddJsonFile("config.json") 
      .AddEnvironmentVariables(); 

     Config = config; 
    } 
} 

Cấu trúc dự án

Bạn sẽ tất nhiên cần phải có một tập tin config.json trong thư mục gốc của dự án chia sẻ của bạn thư mục quá. Vì vậy, cấu trúc dự án của bạn có thể trông giống như thế này:

SharedDataContext 
    Migrations 
    config.json 
    project.json 

WebApp 
    config.json 
    project.json 
    Startup.cs 

Ở phía trên, cả hai tập tin config.json chứa một chuỗi kết nối thiết cho DbContext.

Một vài suy nghĩ

Nếu bạn không thích sao chép chuỗi thứ kết nối config.json, sau đó bạn có thể sử dụng các biến môi trường hoặc bí mật dùng để thay thế.

+0

Đây là giải pháp có thể chấp nhận được nhiều hơn là di chuyển toàn bộ không gian tên vào dự án chính. Di chuyển thêm làm việc hoàn hảo, nhấn một vết sưng với áp dụng: Vì tôi đã sử dụng một tùy chỉnh 'DataDirectory' tôi đã phải làm một số phát hiện ngữ cảnh. Khi chạy từ dòng lệnh 'Path.GetFullPath (" .. \\ MainProject ")' cung cấp cho tôi "C: \ Path \ To \ My \ Project \ src \ MainProject", nhưng khi chạy dự án thực tế tôi nhận được "C: \ Program Files (x86) \ MainProject "thay vào đó! Vì vậy, tôi đã thêm một kiểm tra để xem nếu đường dẫn có chứa văn bản "src" và nó hoạt động ngay bây giờ. Điều này cũng nên chuyển sang sản xuất vì các vars môi trường sẽ ghi đè lên tất cả. – CuddleBunny

+0

Tôi sẽ chấp nhận điều này như là câu trả lời cho đến khi một cái gì đó ít hacky đến cùng. – CuddleBunny

+0

@CuddleBunny Tôi rất vui vì nó đã hoạt động và tôi mong được nhìn thấy thứ gì đó ít hacky hơn. Có thể ai đó từ đội EF sẽ đóng góp một câu trả lời. –

Các vấn đề liên quan