【问题标题】:Accessing DbContext through projects within a solution [duplicate]通过解决方案中的项目访问 DbContext [重复]
【发布时间】:2021-04-30 05:43:05
【问题描述】:

我目前确实有以下设置,这些是不同的项目
Project.DAL:数据访问层
Project.BLL:业务逻辑层
Project.Core:接口,模型
@987654324 @:Web API
Project.Console:简单的 .NET 控制台应用程序

Project.DAL 我确实设置了数据库上下文

 public class AppDbContext : DbContext
    {
        public DbSet<Role> Roles { get; set; }
        public DbSet<User> Users { get; set; }
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options)
        { }

        
       
    }

虽然我在 Project.API 中设置了所有依赖注入

            services.AddTransient<IUserService, UserService>();
            services.AddDbContext<AppDbContext>(options =>
            {
                options.UseSqlServer(Configuration.GetConnectionString("Default"),x => x.MigrationsAssembly("Project.DAL"));
            });

当我尝试在Project.Console 中运行Program.cs

  class Program
    {
        private static AppDbContext _appDbContext; 
        static void Main(string[] args)
        {
            
             _appDbContext.Users.ToList();
        }
}

未处理的异常。 System.NullReferenceException:对象引用未设置为对象的实例。
有什么想法吗?
提前致谢。

【问题讨论】:

    标签: c# .net entity-framework .net-core dependency-injection


    【解决方案1】:

    您需要对所有入口点进行配置。

    1. 入口点是您的 API
    2. 第二个入口点是您的控制台应用程序

    所以你需要修改你的main函数:

      class Program
        {
            private static AppDbContext _appDbContext; 
            static void Main(string[] args)
            {
                // _appDbContext is not initialized right now
                // Even if you configure the injection here the _appDbContext will not be initialized.
                 _appDbContext.Users.ToList();
            }
    }
    

    查看net core console app dependency injection guide

    using System;
    using System.Threading.Tasks;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    namespace ConsoleDI.Example
    {
        class Program
        {
            static Task Main(string[] args)
            {
                using IHost host = CreateHostBuilder(args).Build();
    
                ExemplifyScoping(host.Services, "Scope 1");
                ExemplifyScoping(host.Services, "Scope 2");
    
                return host.RunAsync();
            }
    
            static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureServices((_, services) =>
                        services.AddTransient<ITransientOperation, DefaultOperation>()
                                .AddScoped<IScopedOperation, DefaultOperation>()
                                .AddSingleton<ISingletonOperation, DefaultOperation>()
                                .AddTransient<OperationLogger>());
    
            static void ExemplifyScoping(IServiceProvider services, string scope)
            {
                using IServiceScope serviceScope = services.CreateScope();
                IServiceProvider provider = serviceScope.ServiceProvider;
    
                OperationLogger logger = provider.GetRequiredService<OperationLogger>();
                logger.LogOperations($"{scope}-Call 1 .GetRequiredService<OperationLogger>()");
    
                Console.WriteLine("...");
    
                logger = provider.GetRequiredService<OperationLogger>();
                logger.LogOperations($"{scope}-Call 2 .GetRequiredService<OperationLogger>()");
    
                Console.WriteLine();
            }
        }
    }
    

    上例中的关键代码是这样的:

    provider.GetRequiredService<OperationLogger>();
    

    这是从配置的 DI 容器创建 OperationLogger 的那个。

    您应该创建AppDbContext DI 规则,构建CreateHostBuilder(args).Build(); 并创建如上所示的实例。

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多