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

问题描述 投票:0回答:2

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

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

        }

我不得不添加行services.AddDbContext以使其工作。

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

        }

如果我从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");

    }

我收到以下错误。

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

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

asp.net-core entity-framework-core dbcontext
2个回答
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);
    }
}

0
投票

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

options.UseInMemoryDatabase("database-name");

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

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

© www.soinside.com 2019 - 2024. All rights reserved.