سؤال

أنا بدأت مع إطار الكيان 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.

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