私はnHibernateを初めて使用し、複数のSQLServerデータベースの.NetCoreで使用しようとしています。ドキュメントを確認してIsessionfactotyを作成し、起動時に構成しましたが、リポジトリメソッドでセッションオブジェクトにアクセスしようとすると、1つのデータベース、つまりDbConnectionStringのみを検索しているため、エラーが発生します。
私のstartup.csは次のようになります
var sessionFactory = Fluently
.Configure()
.Database(() =>
{
return FluentNHibernate.Cfg.Db.MsSqlConfiguration
.MsSql2008
.ShowSql()
.ConnectionString(Configuration.GetConnectionString("DbConnectionString"));
})
.Database(() =>
{
return FluentNHibernate.Cfg.Db.MsSqlConfiguration
.MsSql2008
.ShowSql()
.ConnectionString(Configuration.GetConnectionString("AdminDbConnectionString"));
})
.BuildSessionFactory();
services.AddSingleton<NHibernate.ISession>(factory => nHIbernateSession.OpenSession());
これは、コントローラーから呼び出しているリポジトリクラスです。
public class BusinessRepo
{
ISession _session;
public BusinessRepo(ISession session)
{
_session = session;
}
//This method needs to use DbConnectionString
public PersonGeo GetPersonById(string personId)
{
var value = _session.CreateCriteria<PersonGeo>()
.Add(Restrictions.Eq("Person_ID", personId))
.SetCacheable(true)
.SetCacheMode(CacheMode.Normal)
.List<PersonGeo>();
return value.FirstOrDefault();
}
//This method needs to used AdminDbConnectionString
public List<User> GetAllUsers()
{
//If I debug the _session and look for connection string it is taking "DbConnectionstring (which is configured first in startup)"
var result = _session.CreateSQLQuery("SELECT UserID,UserName,Email,IsActive FROM Users").List<User>();
return result();
}
}
これは、コントローラーから呼び出しているリポジトリクラスです。
var person = _repo.GetPersonById(personId);
var allUser = _repo.GetAllUsers();
また、_sessionオブジェクトが他のデータベースを参照しているため、オブジェクト名が「tableName」で見つかりません。誰かがそれを実装する方法についてアイデアを持っていますか?
スタートアップをに変更します
var dbSessionFatory = Fluently
.Configure()
.Database(() =>
{
return FluentNHibernate.Cfg.Db.MsSqlConfiguration
.MsSql2008
.ShowSql()
.ConnectionString(Configuration.GetConnectionString("DbConnectionString"));
})
.BuildSessionFactory();
var adminDbSessionFactory= Fluently
.Configure()
.Database(() =>
{
return FluentNHibernate.Cfg.Db.MsSqlConfiguration
.MsSql2008
.ShowSql()
.ConnectionString(Configuration.GetConnectionString("AdminDbConnectionString"));
})
.BuildSessionFactory();
services.AddSingleton<NHibernate.ISession>(factory => dbSessionFatory.OpenSession());
services.AddSingleton<NHibernate.ISession>(factory => adminDbSessionFactory.OpenSession());
次に、SessionfactoryのIEnumerableをrepositoyメソッドに挿入し、必要なデータベースに特定のsessionfactoryを使用します。
public class BusinessRepo
{
private IEnumerable<ISession> _sessions;
public BusinessRepo(IEnumerable<ISession> sessions)
{
_sessions = sessions;
}
//This method needs to use DbConnectionString
public PersonGeo GetPersonById(string personId)
{
var _session = _sessions.Where(a => a.Connection.Database == "DbName").FirstOrDefault();
var value = _session.CreateCriteria<PersonGeo>()
.Add(Restrictions.Eq("Person_ID", personId))
.SetCacheable(true)
.SetCacheMode(CacheMode.Normal)
.List<PersonGeo>();
return value.FirstOrDefault();
}
//This method needs to used AdminDbConnectionString
public List<User> GetAllUsers()
{
var _session = _sessions.Where(a => a.Connection.Database == "DbName").FirstOrDefault();
//If I debug the _session and look for connection string it is taking "DbConnectionstring (which is configured first in startup)"
var result = _session.CreateSQLQuery("SELECT UserID,UserName,Email,IsActive FROM Users").List<User>();
return result();
}
}
すべてのメソッドで実行する代わりに、データベース名をパラメーターとして受け取り、ISessionオブジェクトを返す別のメソッドを作成することで、リファクタリングすることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加