كيف يمكنك التحقق مما إذا كان هناك جدول مع nhibernate (أو بطلاقة)؟
-
21-09-2019 - |
سؤال
ما هي أفضل طريقة وأكثرها اتساقًا للتحقق مما إذا كان هناك جدول في nhibernate (أو مع nhibernate بطلاقة)؟
هل هذا ممكن؟ أعني أنها تبدو مهمة بسيطة لمثل هذا ORM الشاقة.
أيضًا على سؤال ذي صلة ، هل يمكنك التحقق مما إذا كانت مجموعة من الجداول أو مخطط كامل موجودة مع Nhibernate؟
المحلول
إذا قمت بتخزين تكوين nhibernate في مكان ما أو تفعل ذلك قبل إنشاء مصنع الجلسة الخاص بك ، فمن الممكن التحقق من صحة المخطط الذي تم إنشاؤه مقابل قاعدة البيانات.
public void ValidateSchema(Configuration config)
{
new SchemaValidator(config).Validate();
}
نصائح أخرى
نظرت في الكود المصدري لـ SchemaUpdate. كنت أعلم أن SchemaUpdate يمكنه اكتشاف جدول مفقود ثم إنشاء برنامج نصي إنشاء ، بدلاً من برنامج تحديث. من المؤكد أن الجواب كان هناك.
ال GetTableMetadata
وظيفة في NHibernate.Tool.hbm2ddl.DatabaseMetadata
سيعود الكائن NULL إذا لم يكن هناك جدول في قاعدة بيانات.
عادة ، يقوم SchemaUpdate بإنشاء كائن databasemetadata ويمرر إلى أ Configuration
هدف. ولكن يبدو أن كل ما تحتاجه لإنشاء databasemetadata هو كائن DBConnection و Dialect.
SchemaUpdate ينشئ databasemetadata وبالتالي:
connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);
NHibernate.Cfg.Configuration
ثم المكالمات
ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);
برز هذا السؤال والرد في كل مكان في Google عند البحث عن مثل هذا الحل ، لذلك اعتقدت أنني سأضع ما نجح [بسبب عصر الأسئلة ، على الأرجح إضافة] بالنسبة لي بطريقة أكثر دقة وإيجازًا ؛ "istable":
var configuration = Fluently.Configure()
.Database(MsSqlConfiguration
.MsSql2008
...
.BuildConfiguration();
var session = configuration.BuildSessionFactory().OpenSession();
DatabaseMetadata meta = new DatabaseMetadata((DbConnection)session.Connection, new NHibernate.Dialect.MsSql2008Dialect());
//TABLE_NAME e.g. "hibernate_unique_key"
if (meta.IsTable("TABLE_NAME"))
{
...
نأمل أن يساعد شخص ما لأنني نفذت استراتيجية معقدة مماثلة لما ذكر أعلاه قبل التعثر في هذا ؛)