Đâ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ế.
Bạn đang lưu trữ chuỗi kết nối ở đâu? Có khó mã hóa vào Startup.cs không? –
Nó nằm trong config.json và được nạp với Cấu hình vào AddDbContext –
CuddleBunny