افتح ملف SQL CE في وقت التشغيل مع إطار الكيان 4
-
19-09-2019 - |
سؤال
أنا بدأت مع إطار الكيان 4، وأنا إنشاء تطبيق تجريبي كممارسة تعليمية. التطبيق هو منشئ وثائق بسيط، ويستخدم متجر SQL CE. يحتوي كل مشروع مستندات على ملف بيانات SQL CE الخاص به، ويفتح المستخدم أحد هذه الملفات للعمل في مشروع.
edm بسيط جدا. يتكون مشروع الوثائق من قائمة المواد، لكل منها عنوان، وصف، وصفر أو أكثر من الملاحظات. لذلك، فإن كياناتي موضوعية، والتي تحتوي على خصائص العنوان والنص، والملاحظة، والتي لديها خصائص العنوان والنصوص. هناك ارتباط واحد إلى كثير من الموضوعات لملاحظة.
أحاول معرفة كيفية فتح ملف بيانات SQL CE. يجب أن يتطابق ملف البيانات مع مخطط قاعدة بيانات SQL CE التي تم إنشاؤها بواسطة "إنشاء قاعدة بيانات EF4"، وسأقوم بتطبيق ملفات جديدة استخدم حالة في مكان آخر في التطبيق لتنفيذ هذا الشرط. الآن، أنا أحاول فقط الحصول على ملف بيانات موجود مفتوح في التطبيق.
لقد قمت بإعادة استنساخ رمز "الملف المفتوح" الموجود أدناه. لقد قمت بإعداده كطبقة خدمة ثابتة خدمات الملفات. وبعد لا يعمل الكود حتى الآن، ولكن هناك ما يكفي لإظهار ما أحاول القيام به. أحاول الاحتفاظ بموضوع OpenContext فتح تحديثات كائن الكيان، والتخلص منه عند إغلاق الملف.
إذن، إليك سؤالي: هل أنا على المسار الصحيح؟ ما الذي أحتاج إلى التغيير لجعل هذا الرمز يعمل مع EF4؟ هل هناك مثال على كيفية القيام بذلك بشكل صحيح؟
شكرا لمساعدتك.
الرمز الحالي الخاص بي:
public static class FileServices
{
#region Private Fields
// Member variables
private static EntityConnection m_EntityConnection;
private static ObjectContext m_ObjectContext;
#endregion
#region Service Methods
/// <summary>
/// Opens an SQL CE database file.
/// </summary>
/// <param name="filePath">The path to the SQL CE file to open.</param>
/// <param name="viewModel">The main window view model.</param>
public static void OpenSqlCeFile(string filePath, MainWindowViewModel viewModel)
{
// Configure an SQL CE connection string
var sqlCeConnectionString = string.Format("Data Source={0}", filePath);
// Configure an EDM connection string
var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/EF4Model.csdl|res://*/EF4Model.ssdl|res://*/EF4Model.msl";
builder.Provider = "System.Data.SqlServerCe";
builder.ProviderConnectionString = sqlCeConnectionString;
var entityConnectionString = builder.ToString();
// Connect to the model
m_EntityConnection = new EntityConnection(entityConnectionString);
m_EntityConnection.Open();
// Create an object context
m_ObjectContext = new Model1Container();
// Get all Subject data
IQueryable<Subject> subjects = from s in Subjects orderby s.Title select s;
// Set view model data property
viewModel.Subjects = new ObservableCollection<Subject>(subjects);
}
/// <summary>
/// Closes an SQL CE database file.
/// </summary>
public static void CloseSqlCeFile()
{
m_EntityConnection.Close();
m_ObjectContext.Dispose();
}
#endregion
}
المحلول
هنا هو الجواب. أقوم بتبسيط التعليمات البرمجية وأخرجها على نموذج EDM أبسط، شخصيات ديزني. وبعد النموذج لديه كيانين، Character
و Child
, مع جمعية 1: * بين Character
و Child
. وبعد الأطفال هم أطفال شخصية - أشياء بسيطة جدا. كتبت التجريبي كوسخة وحدة التحكم للحفاظ عليها بسيطة قدر الإمكان.
كود كاملة في Program.cs
على النحو التالي:
class Program
{
static void Main(string[] args)
{
/* See http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/8a89a728-6c8d-4734-98cb-11b196ba11fd */
// Configure an SQL CE connection string
var filePath = @"D:\Users\dcveeneman\Documents\Visual Studio 2010\Demos\SqlCeEf4Demo\SqlCeEf4Demo\DisneyChars.sdf";
var sqlCeConnectionString = string.Format("Data Source={0}", filePath);
// Create an EDM connection
var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/DisneyChars.csdl|res://*/DisneyChars.ssdl|res://*/DisneyChars.msl";
builder.Provider = "System.Data.SqlServerCe.3.5";
builder.ProviderConnectionString = sqlCeConnectionString;
var edmConnectionString = builder.ToString();
var edmConnection = new EntityConnection(edmConnectionString);
// Build and query an ObjectContext
using (var context = new DisneyCharsContainer(edmConnection))
{
var chars = context.Characters;
foreach(var character in chars)
{
Console.WriteLine("Character name: {0}", character.Name);
foreach(var child in character.Children)
{
Console.WriteLine("Child name: {0}", child.Name);
}
}
Console.ReadLine();
}
}
}
رابط في الجزء العلوي من التعليمات البرمجية هو موضوع منتدى اعتدت على كتابة التعليمات البرمجية.
هنا يتم تجوله: أولا، قم بإنشاء اتصال قاعدة بيانات. نظرا لأنني أستخدم SQL CE، ليس لدي بناء سلسلة اتصال - سلسلة الاتصال هي ببساطة مسار، لذلك لا أحتاج إلى واحد. ثم أنا استخدم EntityConnectionStringBuilder
لبناء سلسلة اتصال كيانا، ثم استخدم ذلك لبناء EntityConnection
. وبعد أخيرا، اجتاز الاتصال بالبناء الخاص بي ObjectContext
. وبعد يمكنني بعد ذلك استخدام ObjectContext
للاستعلام عن edm.
نصائح أخرى
العثور على / فتح قاعدة بيانات SQL Server CE هي، لبعض السبب الغريب، من الصعب القيام به. وبعد تأكد من أنه يمكنك تقديم أي نوع من اتصال DB على الإطلاق قبل محاولة الحصول عليه للعمل مع EF.