كيف يمكنك التحقق مما إذا كان هناك جدول مع nhibernate (أو بطلاقة)؟

StackOverflow https://stackoverflow.com/questions/1557023

سؤال

ما هي أفضل طريقة وأكثرها اتساقًا للتحقق مما إذا كان هناك جدول في 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"))
        {
        ...

نأمل أن يساعد شخص ما لأنني نفذت استراتيجية معقدة مماثلة لما ذكر أعلاه قبل التعثر في هذا ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top