code-first-migrations - remove - no se encontró ningún ejecutable que coincida con el comando "dotnet-ef"
Entity Framework 7 Migration Scaffolding en Class Library with Configuration (1)
Aquí hay un enfoque que podría funcionar para usted.
Si lo ejecuto en la carpeta del proyecto compartido, no tiene acceso a la cadena de conexión especificada en startup.cs.
Startup.cs
Supongo que en su Startup.cs, está especificando la cadena de conexión accediendo a Configuration
lugar de codificarla con dificultad. Además, asumo que en el constructor de su archivo Startup.cs, está configurando la configuración desde algunas fuentes. En otras palabras, su Startup.cs podría verse más o menos así:
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
Además, supongo que está agregando la cadena de conexión a un config.json en la raíz de su proyecto (o que lo está agregando a través de secretos de usuario o variables de entorno). Su config.json podría verse más o menos así:
{
"ConnectionStrings": {
"MyDbContext": "Some-Connection-String"
}
}
Si no lo haces de esa manera, valdría la pena intentarlo.
He deducido de preguntas como esta que funciona desde el proyecto compartido si especifica la cadena de conexión en el método OnConfiguring de DbContext pero realmente me gustaría mantener este código separado de la configuración.
DbContext
Si mis suposiciones anteriores son correctas, entonces puede acceder a la cadena de conexión en el DbContext
usando el mismo patrón que utilizó en la clase de Startup
. Es decir, en el constructor DbContext
, configure IConfiguration
. Luego, en OnConfiguring
, accede a la cadena de conexión. Puede parecerse a esto:
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;
}
}
Estructura del proyecto
Por supuesto, también necesitará tener un archivo config.json en la raíz de la carpeta de proyectos compartidos. Entonces, la estructura de sus proyectos podría verse más o menos así:
SharedDataContext
Migrations
config.json
project.json
WebApp
config.json
project.json
Startup.cs
En lo anterior, ambos archivos config.json contienen una configuración de cadena de conexión para el DbContext
.
Algunos pensamientos
Si no te gusta duplicar la cadena de conexión config.json, puedes usar variables de entorno o secretos de usuario.
Intentando agregar migraciones a un modelo EF7 que vive en una biblioteca de clases ASP.NET 5. Cuando se ejecuta dnx . ef migration add mymigration
dnx . ef migration add mymigration
falla con diferentes resultados según el proyecto en el que lo ejecute.
Si lo ejecuto en la carpeta del proyecto principal, no puede encontrar un DbContext
, esto tiene sentido porque el DbContext
está en el proyecto compartido y los comandos ef probablemente no se preocupan por las dependencias.
Si lo ejecuto en la carpeta del proyecto compartido, no tiene acceso a la cadena de conexión especificada en startup.cs. He deducido de preguntas como esta que funciona desde el proyecto compartido si especifica la cadena de conexión en el método OnConfiguring
de DbContext
pero realmente me gustaría mantener este código separado de la configuración.
Encontré algunos registros de problemas en el repositorio de EF7 que mencionan que implementaron opciones de línea de comandos para especificar un proyecto y un contexto, pero no hay ejemplos y no pude encontrar la forma de usarlo al mirar el código fuente en el historial de confirmación. .