- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 .Net Core WebApplication 项目,其中上下文类位于类库中。如果我在 OnConfiguring(DbContextOptionsBuilder optionsBuilder) 方法中硬编码连接字符串,我可以生成迁移。因为让依赖注入(inject)管理上下文更好,所以我想将它添加到启动类中。但是,当我这样做时,出现以下错误:
No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext.
DbContext 类:
public class CustomerManagerContext : IdentityDbContext<User, Role, long, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{
public CustomerManagerContext() { }
public CustomerManagerContext(DbContextOptions<CustomerManagerContext> options) : base(options)
{
}
//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
//{
// base.OnConfiguring(optionsBuilder);
// optionsBuilder.UseSqlServer("SecretConnectionString");
//}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>().ToTable("Users");
builder.Entity<Role>().ToTable("Roles");
builder.Entity<UserClaim>().ToTable("UserClaims");
builder.Entity<UserRole>().ToTable("UserRoles");
builder.Entity<UserLogin>().ToTable("UserLogins");
builder.Entity<RoleClaim>().ToTable("RoleClaims");
builder.Entity<UserToken>().ToTable("UserTokens");
}
}
启动类 - ConfigureServices 方法
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<CustomerManagerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
);
services.AddEntityFrameworkSqlServer()
.AddDbContext<CustomerManagerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<User, Role>()
.AddEntityFrameworkStores<CustomerManagerContext>()
.AddDefaultTokenProviders();
}
最佳答案
这让我很难受,出现如下错误:
No database provider has been configured for this DbContext.
No design-time services were found.
The server was not found or was not accessible.
但我最终得到了一个相当简单的解决方案/解决方法:
在您的解决方案(或命令行)中设置默认的启动项目
在你的 Startup.cs
<强> add the migration-project :
public void ConfigureServices(IServiceCollection services)
{
var myDbContextAssemblyName = typeof(MyDbContext).Assembly.GetName().Name;
var connectionString = Configuration.GetConnectionString(MyDbContext.ConnectionStringName);
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(
connectionString,
x => x.MigrationsAssembly(myDbContextAssemblyName)));
// do more ...
}
在您的连接字符串中使用IP 地址和端口号(灵感来自this corefx issue),而不是服务器名称/dns(FWIW:query to get IP) .所以现在我的 appsettings.Development.json
里有了这个:
“连接字符串”:{“MyConnectionStringName”:“数据源=10.1.2.3,1433;初始目录=MyCatalog;集成安全性=SSPI”
我发现了很多其他建议,我会提到一些看起来很有趣的建议。也许它会帮助别人:
在命令行中提及 startup-project 和 migration-project:
Update-Database -Verbose -Project x.Data -StartupProject x.Web
补充(来自评论):这也适用于 dotnet CLI:
dotnet ef migrations add <MIGRATION_NAME> --project <DATABASE_PROJECT_DIR> --startup-project <STARTUP_PROJECT_DIR> dotnet ef database update --project <DATABASE_PROJECT_DIR> --startup-project <STARTUP_PROJECT_DIR>
也可以在 StartUp 调用迁移, "用于具有本地数据库的应用"。 (我想否则在多个节点上运行,可能会同时启动多个运行时迁移并发问题?)
myDbContext.Database.Migrate();
This EntityFrameworkCore issue状态:
The problem is that when EF calls either
CreateWebHostBuilder
orBuildWebHost
it does so without runningMain
. (This is intentionalbecause EF needs to build the model and use theDbContext
withoutstarting the application.) This means that when EF invokes on of thesemethods the staticIConfiguration
property is still null--since itis only set inMain
. So, you'll need to either make sure thatIConfiguration
is set/handled when EF calls one of these methods, oruseIDesignTimeDbContextFactory
.
这对我来说不是必需的,我猜是因为 .Net Core 2 loads the configuration behind the scenes .
This EntityFrameworkCore issue状态:
The typical way to do this is to read a file, an environment variable, or similar inside
IDesignTimeDbContextFactory
.
这对我来说似乎太过分了。
Some of the EF Core Tools commands (for example, the Migrationscommands) require a derived DbContext instance to be created at designtime in order to gather details about the application's entity typesand how they map to a database schema.
他们提到了这些提供设计时 DbContext 的方法:
The tools try to obtain the
DbContext
object from the application'sservice provider. [...] The tools first try to obtain the serviceprovider by invokingProgram.BuildWebHost()
[JP: orCreateWebHostBuilder
] and accessing theIWebHost.Services
property. TheDbContext
itself and any dependencies in itsconstructor need to be registered as services in the application'sservice provider. This can be easily achieved by having a constructoron theDbContext
that takes an instance ofDbContextOptions<TContext>
as an argument and using theAddDbContext<TContext>
method.
If the
DbContext
can't be obtained from the application serviceprovider, the tools look for the derivedDbContext
type inside theproject. Then they try to create an instance using a constructor withno parameters. This can be the default constructor if theDbContext
is configured using theOnConfiguring
method.
You can also tell the tools how to create your
DbContext
byimplementing theIDesignTimeDbContextFactory<TContext>
interface: Ifa class implementing this interface is found in either the sameproject as the derived DbContext or in the application's startupproject, the tools bypass the other ways of creating theDbContext
and use the design-time factory.
关于c# - EFCore 不识别数据库提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44221389/
自动生成字段值,咱们首先想到的是主键列(带 IDENTITY 的主键)。EF Core 默认的主键配置也是启用 Identity 自增长的,而且可以自动标识主键。前提是代表主键的实体属性名要符合以下规
上次老周扯了有关主、从实体的话题,本篇咱们再挖一下,主、从实体之间建立的关系,跟咱们常用的一对1、一对多这些关系之间有什么不同。 先看看咱们从学习数据库开始就特熟悉的常用关系——多对多、一对
前言 基于EF Core + MySQL的基本增删改查,示例是基于 .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移 项目基础上的内容增加。同时也是
前言 EFCore.BulkExtensions是一个常用的EF core 批量处理数据的库. 但是支持的数据库相对较少.特别是.NET5.0版本 连MySQL都无法支持 这个库就是改造的
我试图在我的上下文类中设置一对一的外键关系,但我不断收到以下错误。我找到了一个 similar post但这似乎并没有解决我的问题,因为我在模型中明确指定了关系。我确认: Server 对象引用了一个
运行 dotnet ef migrations add XYZ将导致 a Migrations directory being created在项目中。这个目录是否应该提交给版本控制(Git 等)?
我试图围绕 EF Cores 拥有的对象以及如何控制何时加载某些数据块。 基本上我有一堆旧的遗留表(一些有大约 150 列),并希望使用一个根实体和每个表的几个拥有的对象对它们进行建模,以实现更好的分
我的模型包含 Post 和 PostHistory 类,其中 Post 与 PostHistory 具有一对多关系。 class Post { public int Id { get; set
我有一个 .Net Core WebApplication 项目,其中上下文类位于类库中。如果我在 OnConfiguring(DbContextOptionsBuilder optionsBuild
我正在尝试使用 Entity Framework Core 2.0.1 将现有的 PostgreSQL 数据库转换为实体,但在搭建脚手架时出现错误。数据库是通过运行以下脚本创建的: Script To
我在一个项目中有两个实体:SupplierFinishingItem 和 ProductOptionListItem。 ProductOptionListItem 通过导航属性引用另一个。 当我尝试创
我已经在 this 之后使用 .Net core 和 EFCore 创建了一个 API使用 VSCode 的教程。 我的 MySQL 数据库有很多模型,因为我正在“迁移”我的 EF6 和 asp.ne
目录 一 代码分析 1 GetTableName 2&n
我正在尝试根据实体特定字段中的搜索值列表来过滤实体。 例如: var searchValues = new List { "abc", "xyz" }; var posts = Context.Pos
我有一个在表中创建列的迁移。 public partial class AddName : Migration { protected override void Up(MigrationBu
Ef Core 接收错误 System.InvalidOperationException: Can't process set operations afterclient evaluation,
我有以下型号。在使用 find 方法从数据库中获取时,用子实体加载父实体的更好方法是什么? 父实体: public class Client { public int Id { get; se
我正在使用 EFCore 做一个原型(prototype),并努力寻找一种返回我刚刚添加到实体集合中的对象的好方法。 例如: public Songleader AddSongleader(int c
这个问题已经有答案了: How is Identity.EntityFramework OnModelCreating called (2 个回答) 已关闭12 个月前。 我知道当您创建迁移时它会被调
这个问题已经有答案了: How is Identity.EntityFramework OnModelCreating called (2 个回答) 已关闭12 个月前。 我知道当您创建迁移时它会被调
我是一名优秀的程序员,十分优秀!