我的解决方案有3个项目:
我想创建函数迁移到Entity Project。 在Entity项目中,我有一个类TemporaryDbContextFactory
public class TemporaryDbContextFactory : IDbContextFactory<MyContext>
{
public ApplicationContext Create(DbContextFactoryOptions options)
{
var builder = new DbContextOptionsBuilder<MyContext>();
builder.UseSqlServer("Server=(local)\\mssqllocaldb;Database=mydatabase;Trusted_Connection=True;MultipleActiveResultSets=true;User ID=sa; Password=123456",
optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyContext).GetTypeInfo().Assembly.GetName().Name));
return new MyContext(builder.Options);
}
}
但在这里我不想使用硬编码连接字符串我试图为动态连接字符串创建appsetting:
public class MyContextFactory : IDbContextFactory<ApplicationContext>
{
public MyContext Create()
{
var environmentName =
Environment.GetEnvironmentVariable(
"Hosting:Environment");
var basePath = AppContext.BaseDirectory;
return Create(basePath, environmentName);
}
public MyContext Create(DbContextFactoryOptions options)
{
return Create(
options.ContentRootPath,
options.EnvironmentName);
}
private MyContext Create(string basePath, string environmentName)
{
var configuration = new Configuration();
configuration.AddJsonFile(“config.json”);
var emailAddress = configuration.Get("emailAddress");
var builder = new ConfigurationBuilder()
.SetBasePath(basePath)
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{environmentName}.json", true)
.AddEnvironmentVariables();
var config = builder.Build();
var connstr = config.GetConnectionString("(default)");
if (String.IsNullOrWhiteSpace(connstr) == true)
{
throw new InvalidOperationException(
"Could not find a connection string named '(default)'.");
}
else
{
return Create(connstr);
}
}
private MyContext Create(string connectionString)
{
if (string.IsNullOrEmpty(connectionString))
throw new ArgumentException(
$"{nameof(connectionString)} is null or empty.",
nameof(connectionString));
var optionsBuilder =
new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlServer(connectionString);
return new MyContext(optionsBuilder.Options);
}
}
我坚持创建一个这个
的实例var configuration = new Configuration();
实体项目没有对Microsoft.Extensions.Configuration的任何引用 我不知道如何添加这个因为我找不到它。请帮我添加此参考或建议我采用不同的方式
答案 0 :(得分:2)
这是一个新的配置框架,在你习惯之后你会喜欢它:
var configuration = new ConfigurationBuilder()
.AddJsonFile("config.json")
.Build();
var emailAddress = configuration.GetValue<string>("emailAddress");
您需要安装以下nuget包:
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.ConfigurationBinder
如果您没有看到,请务必使用正确的Feed。查看软件包管理器的Package Source
组合框,它应该是nuget.org
。
此外,请确保将config.json
配置文件复制到输出:
{
"emailAddress" : "some@example.com"
}
具体关于连接字符串,请查看此示例:https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings#aspnet-core