【问题标题】:Using a different connection provider for Entity Framework on ASP.NET Core在 ASP.NET Core 上为 Entity Framework 使用不同的连接提供程序
【发布时间】:2017-09-04 10:10:23
【问题描述】:

我正在使用 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:不支持关键字:'provider'

【问题讨论】:

  • entityBuilder.ConnectionString的值是多少
  • provider=System.Data.SqlServerCe.3.5;provider connection string="DataSource=C:\MyDb.sdf;Max Database Size=2048;"

标签: c# asp.net-core entity-framework-6 sql-server-ce-3.5


【解决方案1】:

您需要在继承自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
{
    // ...
}

【讨论】:

    【解决方案2】:

    SQL Server Compact 尚未在 .net 核心中开箱即用,因此与简单地编辑提供程序以使其正常工作相比,它涉及更多的工作。您需要创建一个模型才能使其工作。

    您可以使用EntityFramework.SqlServerCompact package 并将其示例模型用作模板。

    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; }
    }
    }
    

    希望这会有所帮助。

    【讨论】:

    • 使用我得到的模板'DbContextOptionsBuilder'不包含'UseSqlCe'的定义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多