طريقة سريعة للكشف عن ما إذا كان يوجد جدول DataContext أو عرض
-
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();
}