我希望能够使用数据库第一种方法在我的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的基础构造函数。
为什么我需要先将连接字符串传递给数据库,然后才能提取数据。请协助。我是核心新手。这两个地方是配置服务方法和上下文本身。
答案 0 :(得分:0)
选项1:删除参数化构造函数和OnConfiguring。结果:
public class TestingContext : DbContext
{
public DbSet<Information> Information { get; set; }
public DbSet<ArticleUser> ArticleUser { get; set; }
}
选项2:删除ConfigureServices
中AddDbContext
中的参数化构造函数和选项
结果:
在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本身。