Использование другого провайдера соединений для Entity Framework в ASP.NET Core
Я использую ASP.NET Core 1.1 с Entity Framework 6 для подключения к базе данных SQL Server Compact 3.5. Как я могу настроить, какой провайдер использовать при создании DbContext
?
MyDbContext.cs
public class MyDbContext: DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// omitted
}
public static DbMasContext Create(string connString)
{
var entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.ProviderConnectionString = connString;
entityBuilder.Provider = "System.Data.SqlServerCe.3.5";
return new DbMasContext(entityBuilder.ConnectionString);
}
}
Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddScoped(_ => DbMasContext.Create(Configuration.GetConnectionString("MyDbContext")));
}
// omitted
}
appsettings.json
{
"ConnectionStrings": {
"MyDbContext": "DataSource=C:\\MyDb.sdf;Max Database Size=2048;",
}
}
Мой код вызывает эту ошибку:
ArgumentException: ключевое слово не поддерживается: "провайдер"
2 ответа
Вам нужно указать провайдера в классе, который наследуется от DbConfiguration
,
SqlCeDbConfiguration
public class SqlCeDbConfiguration: DbConfiguration
{
public DbConfig()
{
SetProviderServices("System.Data.SqlServerCe.3.5", System.Data.Entity.SqlServerCompact.Legacy.SqlCeProviderServices.Instance);
}
}
Тогда вы можете применить DbConfigurationType
приписать к вашему DbContext
класс
MyDbContext.cs
[DbConfigurationType(typeof(SqlCeDbConfiguration))]
public class MyDbContext: DbContext
{
// ...
}
SQL Server Compact еще не работает "из коробки" в ядре.net, поэтому он требует немного больше работы, чем простое редактирование провайдера, чтобы заставить его работать. Вам нужно создать модель, чтобы она работала.
Вы можете использовать пакет EntityFramework.SqlServerCompact и использовать их пример модели в качестве шаблона.
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace Sample
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlCe(@"Data Source=C:\data\Blogging.sdf");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasMany(b => b.Posts)
.WithOne(p => p.Blog)
.HasForeignKey(p => p.BlogId);
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
}
Надеюсь это поможет.