【问题标题】:Best approach for adding another DbContext添加另一个 DbContext 的最佳方法
【发布时间】:2021-07-16 00:34:02
【问题描述】:

所以我想知道将另一个 DbContext 附加到我的 ASP.NET 应用程序的最佳方法是什么。我正在尝试实现DbContext,我可以在我的代码中的任何地方使用,而不仅仅是在控制器中。我试图将其添加为服务但失败了。在Configure 中,我正在使用IHubContext 创建一个新类以连接到客户端,但我还需要从数据库中检索数据,所以我正在考虑编辑构造函数Baloon 并根据需要添加DbContext。我想听听你们说什么是最好的。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddDbContext<DiscordContext>();
    ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    StartBalloon(app.ApplicationServices.GetRequiredService<IHubContext<BalloonHub>>());
    ...
}

private static void StartBalloon(IHubContext<BalloonHub> context)
{
    Globals.Bln = new Balloon(context); // Starting balloon
}

DiscordContext.cs

public class DiscordContext : DbContext
{
    public DbSet<DbUser> Users { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySQL("---connection_string----");
    }
}

气球.cs

public class Baloon
{
    private IHubContext<BalloonHub> _context;
    private DbContext _db;
    private List<BalloonPlayer> _currentPlayerList = new();
    public int? WhenToPop;
    public int? CurrentLevel;
    public int? BotValue;
    public int? CurrentValue;
    public bool Pooped;
    public bool Running;
    public Balloon(IHubContext<BalloonHub> context)
    {
        _context = context;
        Task.Run(Main);    // Let's imagine that there is need for data from database(DbContext)
    }
}

【问题讨论】:

    标签: c# entity-framework entity-framework-core


    【解决方案1】:

    您可以为控制器创建一个基类,将 DbContext 暴露给您的 deride 类。类似的概念也适用于其他普通商务舱。

    试试看下面的网址。

    When should I create a new DbContext()

    【讨论】:

      【解决方案2】:

      所以我设法做了这样的事情

      DiscordControl.cs

      public class DiscordControll : IDisposable
          {
              public bool IsDead { get; set; }
              public DiscordControll()
              {
              }
      
              private DiscordContext _database;
      
              protected DiscordContext Database
              {
                  get
                  {
                      return _database ??= new DiscordContext();
                  }
              }
      
              public void Dispose()
              {
                  IsDead = true;
                  Database.Dispose();
              }
          }
      

      气球.cs

      public class Baloon : DiscordControll
      {
          private IHubContext<BalloonHub> _context;
          private List<BalloonPlayer> _currentPlayerList = new();
          public int? WhenToPop;
          public int? CurrentLevel;
          public int? BotValue;
          public int? CurrentValue;
          public bool Pooped;
          public bool Running;
          public Balloon(IHubContext<BalloonHub> context)
          {
              _context = context;
              using (Database)
              {
                  Console.WriteLine(
                  Database.Users.GetUserByUlong(discordId).Points)
              }
              Console.WriteLine(IsDead)
              Task.Run(Main);    
          }
      }
      

      它有效,但它没有处理,IsDead 总是假的,所以我假设它是活跃的。

      【讨论】:

        【解决方案3】:

        对于 dispose 最佳实践,您可以查看 Panagiotis Kanavos 的示例。祝你好运

        Destructor never gets called

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-16
          • 2016-05-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多