shuxinqin / Chloe

A lightweight and high-performance Object/Relational Mapping(ORM) library for .NET --C#
https://github.com/shuxinqin/Chloe/wiki
MIT License
1.52k stars 455 forks source link

如何释放 DbContext ? #312

Closed LightningPH closed 2 years ago

LightningPH commented 2 years ago

string connString = "Your connection string"; MsSqlContext dbContext = new MsSqlContext(connString); 释放方法是这样吗?dbContext= null;

================================ 如果在一个DbHelper类中,有一个静态属性,引用了MsSqlContext实例,如下: private static IDbContext _sqlServerDbContext; public static IDbContext SqlServerDbContext { get { if(_sqlServerDbContext == null) { _sqlServerDbContext = new MsSqlContext(new SQLServerConnectionFactory(strSqlServerConn)); } return _sqlServerDbContext; } set { _sqlServerDbContext = value; } }

 正确的使用方法是不是如下?
  DbHelper.SqlServerDbContext.Xxx
  DbHelper.SqlServerDbContext =null

  请Shuxin大神释疑,谢谢!
shuxinqin commented 2 years ago

dbContext.Dispose()

nodyang commented 2 years ago

string connString = "Your connection string"; MsSqlContext dbContext = new MsSqlContext(connString); 释放方法是这样吗?dbContext= null;

================================ 如果在一个DbHelper类中,有一个静态属性,引用了MsSqlContext实例,如下: private static IDbContext _sqlServerDbContext; public static IDbContext SqlServerDbContext { get { if(_sqlServerDbContext == null) { _sqlServerDbContext = new MsSqlContext(new SQLServerConnectionFactory(strSqlServerConn)); } return _sqlServerDbContext; } set { _sqlServerDbContext = value; } }

 正确的使用方法是不是如下?
  DbHelper.SqlServerDbContext.Xxx
  DbHelper.SqlServerDbContext =null

  请Shuxin大神释疑,谢谢!

不建议你静态的

LightningPH commented 2 years ago

不建议用静态的,能详尽解释说明一下吗?C#新手请您指点一下。

LightningPH commented 2 years ago

@shuxinqin 请shuxin大神赐教!谢谢!

` using Chloe; using Chloe.SqlServer; using System.Configuration;

namespace CIM.Interface.Common.Helper { public class DbHelper { private static readonly string strSqlServerConn = ConfigurationManager.ConnectionStrings["SqlServerConnectionString"].ConnectionString;

    private IDbContext _dbContext;
    /// <summary>
    /// SqlServer数据库上下文
    /// </summary>
    public IDbContext DbContext {
        get {
            if(_dbContext == null) {
                _dbContext = new MsSqlContext(strSqlServerConn);
            }
            return _dbContext;
        }
        set {
            _dbContext = value;
        }
    }
}

} `

问题:

  1. 如上使用方式对吗?希望使用DbHelper的理由是:连接字符串放在配置文件中,最终使用还要进行加密解密。

  2. 每次的增删改查,都要按如下方式做,对吗? DbHelper dbHelper = new DbHelper(); dbHelper.DbContext.Xxx; dbHelper.DbContext.Dispose();

  3. 原来打算使用DbHelper中的静态属性DbContext 引用MsSqlContext实例,结果静态属性释放后,其它地方再调用时,就报错,这是什么原因?是静态属性只有程序启动时进行初始化?后续再引用静态属性,其get方法,即使发现_dbContext == null,也不再给静态属性初始化?

  4. 大神有没有一个如何初始化Chloe框架使用的标准案例?SqlServer数据为例。

  5. 在new DbHelper(),涉及MsSqlContext的创建,涉及数据库的连接等,new DbHelper()是不是要放在try...catch...finally语句中?

shuxinqin commented 2 years ago

嗯,不要设置成静态,要保证线程安全即可。 在web中都是通过ioc去创建DbContext,ioc会控制着对象的生命周期,不需要手动new 和dispose。 在其他类型的应用中就得自己控制了~

LightningPH commented 2 years ago

谢谢shuxin!