You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行程序时DB Context为空问题排查求助

数据库连接问题:DbContext在SelectCharacter中无法正常工作

我折腾了半天,连接数据库时DbContext没法正常工作。添加/移除DbSet的时候能正常连接数据库,但搞不清楚SelectCharacter文件里的DbContext到底哪里出问题。我试过按照文档修改using var context的多种写法,包括手动打开和关闭连接,也调整过连接逻辑的位置,现在不确定问题出在SelectCharacter访问数据库的代码里,还是Program.cs本身有问题。

HeroesDBContext代码

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace HeroesDB
{
    public class HeroesDBContext : DbContext
    {
        public static DbSet<HeroModels.Mage> Mages { get; set; }
        public static DbSet<HeroModels.Archer> Archers { get; set; }
        public static DbSet<HeroModels.Weapon> Weapons { get; set; }
        public static DbSet<HeroModels.Food> Foods { get; set; }
        public DbSet<UserRegistration.UserController> Users { get; set; }

        public HeroesDBContext()
        {

        }

        public HeroesDBContext(DbContextOptions options)
            : base(options)
        {

        }

        //add to allow migrations when the context is not built
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                var builder = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

                var config = builder.Build();
                var cnstr = config["ConnectionStrings:HeroesDB"];
                var options = new DbContextOptionsBuilder<HeroesDBContext>().UseSqlServer(cnstr);
                optionsBuilder.UseSqlServer(cnstr);
            }
        }
    }
}

Program.cs代码

using Microsoft.Extensions.Configuration;

namespace Heroes
{
    public static class Program
    {
        public static IConfigurationRoot _configuration;

        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {

            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
            _configuration = builder.Build();


            SelectCharacter.CharacterSelection();
            Adventure.AdventureStart();

        }
    }
}

SelectCharacter代码

using HeroesDB;
using HeroModels;
using Microsoft.EntityFrameworkCore;
using SolutionItems;

namespace Heroes
{
    public partial class SelectCharacter
    {
        private static readonly HeroCreation heroCreation = new();
        private static readonly Mage mage = heroCreation.mage;
        private static readonly Archer archer = heroCreation.archer;
        public static IHero CurrentCharacter;

        private string _cnstr;
        private static DbContextOptionsBuilder _optionsBuilder;
        public SelectCharacter()
        {
            _cnstr = Program._configuration["ConnectionStrings:HeroesDB"];
            _optionsBuilder = new DbContextOptionsBuilder<HeroesDBContext>().UseSqlServer(_cnstr);
        }

        private static void RegisterUser()
        {
            using var context = new HeroesDBContext(_optionsBuilder.Options);
            
            var user = new UserRegistration.UserController();
            Console.WriteLine("Please enter a username:");
            var username = Console.ReadLine();
            //Check if username is already taken
            var userExists = context.Users.Any(u => u.Username == username);
            if (userExists)
            {
                Console.WriteLine("Username already exists. Please try again.");
                RegisterUser();
            }
            else
            {
                user.Username = username;
            }
            Console.WriteLine("Please enter a password:");
            var password = Console.ReadLine();
            //ensure password is at least 8 characters
            if (password.Length < 4)
            {
                Console.WriteLine("Password must be at least 4 characters. Please try again.");
                RegisterUser();
            }
            else
            {
                user.Password = password;
            }
            user.Password = password;
            user.Username = username;
            context.Users.Add(user);
            context.SaveChanges();
        }
    }
}

内容的提问来源于stack exchange,提问作者The_Rico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:35:50