طريقة سريعة للكشف عن ما إذا كان يوجد جدول DataContext أو عرض

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

  •  21-08-2019
  •  | 
  •  

سؤال

وحاليا، أنا تطوير التطبيقات التي تعتمد على (وبالتالي يصل إلى) قواعد البيانات المختلفة عن طريق وLINQ إلى SQL. واحدة من قواعد البيانات، سلسلة الاتصال قد تختلف وبالتالي فهو شكلي - ومع ذلك، فإن مخطط قاعدة البيانات هذه مطابق لجميع سلاسل اتصال.

وبسبب سلسلة الاتصال شكلي، وأريد للتحقق من صحة DataContext أثناء بدء طلبي، للتأكد من أن جميع الجداول وطرق يستخدم طلبي، تتوفر.

ويتم تهيئة الكائنات Table<T> في كائن DataContext دائما - حتى إذا لم يكن لدى الجدول SQL المقابلة أو عرض أية سجلات.

وحتى ذلك الحين. حاليا، يتم إجراء التحقق من الصحة كما يلي:

        bool valid = _dataContext.Articles.Count() > 0
            && _dataContext.Customers.Count() > 0
            && _dataContext.Orders.Count() > 0;

ولئن كان هذا لا العمل، وتحديد قيمة صالحة يأخذ بعض الوقت (لمست كل سجل من كل الجدول)، مما يؤدي في نهاية المطاف في مهلة. لذلك، هناك طريقة أسرع وأكثر موثوقية لتحديد ما إذا كان أو لم يكن Table<T> من DataContext معينة موجودة فعلا كجدول في قاعدة البيانات المطابقة؟

هل كانت مفيدة؟

المحلول

وهنا هو (غير مجربة) فكرة:

والاستيلاء على اسم الجدول الخاص بك. يمكنك رمز من الصعب في، أو يمكنك الاستيلاء عليها برمجيا عبر

TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
                           .GetCustomAttributes(typeof(TableAttribute), true)
                           .Single();
string name = attribute.Name;

وMyTableObject هو كائن LINQ إلى SQL ولدت الواردة في Table الخاص بك، أي في T المعلمة عام في Table<T>.

و( TableAttribute في System.Data.Linq.Mapping ).

استخدم طريقة DataContext.ExecuteQuery كما هو الحال في

var db = new MyDataContext();
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'");
bool hasTable = results.Any(s => "dbo." + s == name);    

نصائح أخرى

وتغيير طفيف على الجواب جيسون (أعطيت له upvote:))

public bool TableExistsInDatabase<T>()
{
  TableAttribute attribute = (TableAttribute)typeof(T)
                             .GetCustomAttributes(typeof(TableAttribute), true)
                             .Single();

  var result = ExecuteQuery<bool>(
                String.Format(
                  "IF OBJECT_ID('{0}', 'U') IS NOT NULL
                   SELECT CAST(1 AS BIT) ELSE 
                   SELECT CAST(0 AS BIT)", attribute.Name));

  return result.First();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top