La mia domanda è fondamentalmente: è possibile utilizzare Entity Framework Core (e migrazioni) all'interno di un progetto di libreria .NET Standard 2.0? (non un progetto principale)
Al momento ho 2 progetti:
Progetto principale di ASP.NET Core : non voglio nulla con database o EF all'interno di questo progetto, quindi ho aggiunto un riferimento al progetto DAL .NETstandard2.0
Progetto layer di accesso ai dati .NETStandard2.0 : progetto EF Core con database migrazioni per l'accesso al database. Il progetto principale utilizza questo progetto per ottenere dati dal database.
Per il progetto DAL .NET standard, utilizzo le seguenti impostazioni e classi: il file .csproj
contiene le dipendenze per EF e le migrazioni:
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
Dopo aver richiamato il dotnet restore
, ho creato un discendente di DbContext
:
class MyTestContext: DbContext
{
public MyTestContext(DbContextOptions<MyTestContext> options) : base(options)
{
}
public DbSet<Class1> Class1Table { get; set; }
}
E aggiunto un DbContextFactory
con IDesignTimeDbContextFactory
come:
class DbContextFactory : IDesignTimeDbContextFactory<MyTestContext>
{
public MyTestContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<MyTestContext>();
builder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=efmigrations2017;Trusted_Connection=True;MultipleActiveResultSets=true",
optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyTestContext).GetTypeInfo().Assembly.GetName().Name));
return new MyTestContext(builder.Options);
}
}
Va bene, finora tutto funziona correttamente e il progetto .NETStandard si sviluppa correttamente.
Ora voglio creare la mia prima migrazione eseguendo:
dotnet ef migrations add InitialCreate
Se capisco correttamente il messaggio di errore, EF Core può essere utilizzato solo nei progetti .NET Core e .NET Framework e NON nei progetti .NETStandard?
Se ciò è vero, come posso separare la logica del database EF dalle altre mie applicazioni?
In caso contrario, come posso far funzionare le migrazioni?
Grazie in anticipo
Hai due opzioni.
Uno: usa il tuo progetto ASP.NET Core come progetto di avvio.
dotnet ef migrations add InitialCreate --startup-project ..\MyWebApplication
Due: Cross-target .NET Core nella libreria di classi. (Modifica il *.csproj
)
<PropertyGroup>
<!-- Note: This property name becomes plural. -->
<TargetFrameworks>netcoreapp2.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>