使用实体框架核心的数据库第一种方法创建数据库上下文。

时间:2017-08-12 22:01:34

标签: asp.net-core entity-framework-core dbcontext

我希望能够使用数据库第一种方法在我的webapi项目中使用entityframework核心创建数据库上下文。 当我这样创作时,效果非常好

ofFloat

我必须添加一行services.AddDbContext才能使其正常工作。

    public class TestingContext : DbContext
        {
            public TestingContext(DbContextOptions<TestingContext> options)
                : base(options)
            {
            }

            public TestingContext()
            {
            }

            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlServer("Data Source=xxxxxx;Initial Catalog=xxxxxx;Integrated Security=False;User Id=xxxxx;Password=xxxxx;MultipleActiveResultSets=True");

            }

            public DbSet<Information> Information { get; set; }
            public DbSet<ArticleUser> ArticleUser { get; set; }

        }

如果我从TestingContext中删除此方法

     public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddCors();
            //using Dependency Injection
            services.AddSingleton<Ixxx, xxx>();

            // Add framework services.

            services.AddApplicationInsightsTelemetry(Configuration);
            services.AddDbContext<TestingContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            // Register the Swagger generator, defining one or more Swagger documents
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info { Title = "Articles API", Version = "v1" });
            });

        }

我收到以下错误。

没有为此DbContext配置数据库提供程序。 可以通过重写DbContext.OnConfiguring方法或配置提供程序 在应用程序服务提供程序上使用AddDbContext。如果使用AddDbContext, 然后还要确保您的DbContext类型接受其中的DbContextOptions对象 构造函数并将其传递给DbContext的基础构造函数。

为什么我需要先将连接字符串传递给数据库,然后才能提取数据。请协助。我是核心新手。这两个地方是配置服务方法和上下文本身。

2 个答案:

答案 0 :(得分:0)

选项1:删除参数化构造函数和OnConfiguring。结果:

public class TestingContext : DbContext
{
    public DbSet<Information> Information { get; set; }
    public DbSet<ArticleUser> ArticleUser { get; set; }
}

选项2:删除ConfigureServicesAddDbContext中的参数化构造函数和选项 结果:

Startup.cs

services.AddDbContext<TestingContext>();

TestingDbContext.cs

public class TestingDdContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Data Source=xxxxxx;Initial Catalog=xxxxxx;Integrated Security=False;User Id=xxxxx;Password=xxxxx;MultipleActiveResultSets=True");
    }

    public DbSet<Information> Information { get; set; }
    public DbSet<ArticleUser> ArticleUser { get; set; }
}

选项3:创建工厂需要参数构造函数。例如:

public class TestDdContext : DbContext
{
    public TestDdContext(DbContextOptions options) : base(options)
    {
    }

    //TODO: DbSets
}

public class TestDbContextFactory : IDbContextFactory<TestDdContext>
{
    public TestDdContext Create(DbContextFactoryOptions options)
    {
        var contextOptions = new DbContextOptionsBuilder();

        contextOptions.UseSqlServer("...");

        return new TestDdContext(contextOptions.Options);
    }
}

答案 1 :(得分:0)

如果要创建测试,是否需要支持Sql数据库?内存提供商是否会为您提供更好的服务?

options.UseInMemoryDatabase("database-name");

由于这个原因,我放弃使用OnConfiguring方法,而依靠将DbContextOptions传递给构造函数

  

旁注,您必须考虑正在测试的 -正在测试依赖于DbContext的代码,还是正在测试DbContext本身-如果没有自定义逻辑,而您仅扩展DbContext,则为此编写测试可能没有足够的价值-并且您不负责测试EFCore本身。