paw*_*eto 5 .net c# dependency-injection entity-framework-core asp.net-core
我有一个 .NET 5.0 项目,一切正常 - 构建、执行、正常工作 - 直到 4 月 10 日。
现在我在注册服务时遇到很多错误。
Unhandled exception. System.AggregateException: Some services are not able to be constructed
(Error while validating the service descriptor 'ServiceType: AService.DataAccess.MyDbContext
Lifetime: Scoped ImplementationType: AService.DataAccess.MyDbContext': Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbSet`1[AService.Domain.Entities.B.B]' while
attempting to activate 'AService.DataAccess.MyDbContext'.) (Error while validating the
service descriptor 'ServiceType:
MediatR.IRequestHandler`2[AService.Api.Queries.B.GetAllQuery,
System.Collections.Generic.IEnumerable`1[AService.Api.Queries.B.Dtos.BDto]]
Lifetime: Transient ImplementationType:
AService.Queries.B.GetAllQueryHandler': Unable to resolve service for type
'Microsoft.EntityFrameworkCore.DbSet`1[AService.Domain.Entities.B.B]' while
attempting to activate 'AService.DataAccess.MyDbContext'.)
Run Code Online (Sandbox Code Playgroud)
我简短地说 - 每个存储库、每个服务、需要注册的所有内容都注册如下Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
services.AddDbContext<MyDbContext>();
services.AddStackExchangeRedisExtensions<NewtonsoftSerializer>((options) =>
Configuration.GetSection("Redis").Get<RedisConfiguration>());
services.AddMediatR(Assembly.GetExecutingAssembly());
services.AddTransient<IARepository, ARepository>();
services.AddTransient<IBRepository, BRepository>();
services.AddTransient<ICRepository, CRepository>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "Service API", Version = "v1.0"});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseRouting();
app.UseCors();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Menu Service API v1.0");
});
}
Run Code Online (Sandbox Code Playgroud)
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
Run Code Online (Sandbox Code Playgroud)
我不知道是不是Rider版本的问题(我在macos上编程)。当我调试时,出现以下错误消息:
IL 变量在当前本机 IP 上不可用。(0x80131304)。错误代码为 CORDBG_E_IL_VAR_NOT_AVAILABLE 或 0x80131304。
有人知道什么会导致该错误吗?正如我一开始所说的,几天前一切都运转良好。
编辑-添加了 MyDbContext:
public class MyDbContext : DbContext
{
public MyDbContext(DbSet<A> a, DbSet<B> b, DbSet<C> c)
{
As = a;
Bs = b;
Cs = c;
}
public DbSet<A> As { get; }
public DbSet<B> Bs { get; }
public DbSet<C> Cs { get; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=localhost;Database=my-db;User=user;Password=password");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<B>()
.HasOne(mi => mi.A)
.WithMany(m => m.Bs)
.HasForeignKey(mi => mi.AId);
modelBuilder.Entity<B>()
.Property(mi => mi.Xs)
.HasConversion(
a => string.Join(',', a),
a => a.Split(',', StringSplitOptions.RemoveEmptyEntries));
}
}
Run Code Online (Sandbox Code Playgroud)
删除构造函数并向DbSet属性添加设置器:
public class MyDbContext : DbContext
{
public DbSet<A> As { get; private set; } // or public setters
public DbSet<B> Bs { get; private set; }
public DbSet<C> Cs { get; private set; }
.....
}
Run Code Online (Sandbox Code Playgroud)
DI 容器使用构造函数来发挥其魔力,并尝试解析和注入所有构造函数参数。由于您还没有(也不应该)注册DbSet- 它们无法解决。
| 归档时间: |
|
| 查看次数: |
22481 次 |
| 最近记录: |