2017-02-13 19 views
9

Tôi đang gặp sự cố khi thêm di chuyển ban đầu vào bối cảnh cơ sở dữ liệu Khung thực thể của tôi bên trong thư viện lớp .NET Core..NET Entity Framework - Thêm di chuyển cho Ngữ cảnh trong thư viện lớp

Khi tôi chạy:

dotnet ef migrations add migrationName -c PlaceholderContext 

tôi nhận được lỗi:

Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds. 

Vì vậy, tôi nhấp vào link và biết rằng nó không thể thêm một chuyển đổi sang một thư viện lớp. Tuy nhiên bạn có thể chuyển đổi dự án thư viện lớp thành một dự án "ứng dụng" nhưng bằng cách làm như vậy tôi không thể tham chiếu dự án "ứng dụng" này từ lớp nghiệp vụ của tôi (thư viện lớp).

cấu trúc dự án:

Placeholder.Web (WebAPI) =>Placeholder.Business (lớp thư viện) =>Placeholder.Data (lớp thư viện)

Project structure

Placeholder.Web => Startup.cs

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddMvc(); 

     //HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER) 
     services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;"); 

     services.InjectWebServices(); 
     services.InjectBusinessServices(); 
    } 

Làm cách nào để khắc phục sự cố thực sự gây phiền toái này?

Cập nhật (1)

tôi đã chuyển đổi thư viện lớp Placeholder.Data tôi đến một "ứng dụng" với một phương pháp chính tĩnh. Bởi vì tôi không còn có thể tham khảo Placeholder.Data từ Placeholder.Business Tôi phải đi với workaround 2 được liệt kê trên trang tài liệu microsoft. Khi tôi bây giờ chạy kịch bản di dân tôi nhận được như sau:

No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext

Doh ofcourse wont work này, dbcontext được đăng ký từ ứng dụng Placeholder.Web của tôi, (thông qua lớp kinh doanh). Sau đó, tùy chọn duy nhất của tôi là thêm ngữ cảnh mới vào phương thức tĩnh mới và tôi thực sự không muốn thực hiện điều này.

Trả lời

6

Bạn không cần phải 'chuyển đổi' dự án dữ liệu của mình thành ứng dụng. Đây là một ứng dụng thử nghiệm với một cấu trúc tương tự:

project structure

Trong project.json trong dự án dữ liệu, thêm các gói NuGet asp.net lõi.

project.json

Bây giờ, để tạo ra một sự chuyển đổi, chỉ cần nhấp chuột phải vào dự án dữ liệu, chọn 'Open folder trong file explorer,' sau đó trong file explorer, nhấn Shift + click chuột phải và cửa sổ 'Open lệnh ở đây. '

Để tạo sự di chuyển, chỉ cần chỉ định của dự án khởi động 'như các ứng dụng web (nơi startup.cs tồn tại)

dotnet ef --startup-project ../TestPatterns2.Web migrations add Second 

migrations

Và thì đấy, di cư:

second migration

THÊM DANH SÁCH DI CHUYỂN DÀNH CHO DỰ ÁN DỮ LIỆU: khi bạn xác định servi ce, thêm điểm di chuyển như vậy

services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data"))); 
+0

Tôi sẽ thử sau này khi tôi về nhà! – Reft

+0

vui lòng đánh dấu là câu trả lời nếu nó phù hợp với bạn. nếu bạn muốn tiến thêm một bước nữa, bạn cũng có thể mở rộng IServiceCollection trong dự án thư viện lớp DATA và thêm DI và các chuỗi kết nối vào đó để dự án Web của bạn hoàn toàn độc lập với dự án DATA. – Reza

+0

Xin lỗi vì đã trả lời muộn, chỉ cần thử mã của bạn và nó hoạt động, cổ vũ. Nhưng! Nếu bạn nhìn vào cấu trúc dự án của tôi, tôi có một thư mục tự tạo tên là migrations. Khi tôi chạy lệnh, tôi nhận được một thư mục di chuyển mới trong thư mục gốc của tôi? 1. Tôi có thể thay đổi điều này không? 2. Nếu tôi muốn thêm nhiều lần di chuyển sau lần di chuyển đầu tiên đầu tiên, tôi có cần thực hiện lại các bước này hoặc có thể tạo nó theo cách thông thường với bảng điều khiển quản lý gói không? – Reft

1

Nó chỉ cần là ứng dụng để thực hiện di chuyển (cần điểm nhập). thư viện ứng dụng và tạo di chuyển của bạn, hãy nhận xét các thành phần buildOptionsruntimes trong project.json của bạn. Nó bây giờ sẽ xây dựng như một thư viện một lần nữa.

Bỏ ghi chú bất cứ khi nào bạn cần thêm một lần di chuyển khác.

+0

Tôi đã thử chuyển đổi từ "netstandard1.6" sang "netcoreapp1.0" nhưng tôi nhận được .Data không tương thích với netstandard1.6. – Reft

+0

Ok, tôi phải dỡ lớp Business (tham chiếu) và sau đó nó hoạt động. Tôi đã chuyển đổi thư viện lớp thành một ứng dụng. Bởi vì tôi không thể tham khảo .Data từ .Business Tôi buộc phải đi với Workaround 2. Có vẻ như tôi cần phải đăng ký bối cảnh bằng cách sử dụng phương pháp chính trong .Data? Tôi không muốn làm điều này .. – Reft

+0

@Reft Giải pháp tôi đã sử dụng là khai báo một DBFactory cho nó thay thế. Tôi không nhớ bài đăng trên blog mà tôi đã tìm thấy để làm điều đó, xin lỗi. – BradleyDotNET

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