none
שליפת נתונים מENTITY FRAMEWORK RRS feed

  • שאלה

  • אני כותבת פרויקט בWPF עם ENTITY FRAMEWORK ,

    איך אני שולפת את הנתונים ממסד הנתונים? 

    למה כאשר אני מנסה להוסיף רשומה למסד הנתונים  נדרסת לי הרשומה האחרונה - לא מתוספת לי עוד רשומה?


    יום חמישי 27 נובמבר 2014 10:00

תשובות

  • כדי לדעת למה נדרסת הרשומצה האחרונה אנחנו צריכים לראות את הקוד ולהבין מה את עושה :-)
    אנחנו לא יכולים לנחש

    לגבי השאלה ראשונה אני חושב שהקישור שנתן tetitu הוא מסביר את החלק של ההכנסה למסד נהתונים ובאותו מקום יש גם מדריך לשליפת הנתונים (לא בדקתי אם הוא טוב):
    http://geekswithblogs.net/dotNETvinz/archive/2010/03/11/fetching-data-from-database-and-populating-fields-in-the-form.aspx


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    • הוצע כתשובה על-ידי pituachMVP, Moderator שבת 29 נובמבר 2014 17:38
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 02 דצמבר 2014 09:03
    יום חמישי 27 נובמבר 2014 23:06
    מנחה דיון
  • הסיבה שנוצר קובץ חדש כאשר לא עובדים בשיטת Code First, זה בדרך כלל פשוט כי הקובץ אינו קיים במקום שה VS מצפה למצוא אותו (זה משהו שקורה בתהליך של בניית הפרויקט ב VS).

    אתה שוכח שה BIN היא התקייה של הפרויקט הרץ, והתקייה מעל שאנחנו קוראים לה תקייה של הפרויקט היא רק לצרכי הפיתוח. בסיום הפיתוח קובץ ה EXE כאשר מייצרים אפליקציית הרצה למשל, יהיה בתקיית ה BIN בברירת המחדל. לכן זו התקיה של הבסיס של הפרויקט שלך במקרים אלו, כאשר אתה מריץ את הפרויקט ישירות ב VS.

    בכל מקרה אתה יכול לשנות את המסלול לקובץ בצורה ידנית בשרשרת ההתחברות. שים לב שיש לך שימוש בהגדרה הבאה:

    attachdbfilename=|DataDirectory|\ExampleDB.mdf;

    מה שזה אומר שהקובץ שלך נמצא במיקום יחסי (אתה רואה שהמיקום לא מתחיל בשם הכונן אלא ב קןו שמסמן "המקום הנוכחי" ואז נכנסים לתקייה בשם DataDirectory ושם נעשה שימוש בקובץ בשם ExampleDB.mdf), אתה יכול לעשות שימוש במיקום מוחלט ולא יחסי אם אתה רוצה.

    1. אני ממליץ בחום לא לעבוד בצורה כזו עם מסדי נתונים אלא לעבוד עם מסד נתונים שרץ ב Instance הראשי של שרת ה SQL. בניגוד לגרסאות בתשלום לגרסת ה SQL Express יש אפשרות לעבוד עם מה שנקראה Dynamic Instances או בשם אחר User Instances. זו שיטה מאוד לא מומלצת לדעתי! מה גם שבאפליקציה חיה אתה ככל הנראה תעבוד עם מסד נתונים שמוגדר בשרת, ולא כזה שיהיה בתקייה של הפרויקט.

    בקיצור הרעיון הוא לעזור עם מסד הנתונים בדיוק כמו שעובדים עם כל מסד נתונים אחר בשרת SQL בגרסה אחרת. זה גם יעזור לך להבין את הטעות בדיון בפורום האחר, ולהבין שאם את עובדת עם SQL EPRESS אז את התקנת את השרת (גם אם את לא יודעת שהוא מותקן).

    2. אם אתה כבר רוצה מסד נתונים שיהיה חלק מהפרויקט אז SQL Server Express לא מתאים מכיוון שהוא לא חלק מהפרויקט, הוא רק שומר את הקובץ בתקייה של הפרויקט אבל הוא רץ על השרת שמותקן. הדרך לעבודה עם מסד נתונים שהוא חלק מהפרויקט זה לעבוד עם מסדי נתונים מוטבעים (embedded database) באפליקציה כמו sqlite או SQL Server Compact. הה כבר מתקשר לדיון בפורום פיתוח WEB :-) שם יש עוד פרטים בנושא

    הקישור הבא יוכל לעזור בדוגמאות של כל האפשרויות של שרשרת התחברות למסד הנתונים SQL מכל הסוגים שלו:
    http://www.connectionstrings.com/sql-server-2012/

    2. בכל מקרה מומלץ להחליף את השימוש בשרת SQL Express המיושן בגישה שלו לשימוש בשרת גרסת ה LocalDB. רשמית מ 2012 זו ההמלצה של מיקרוסופט.

    ********** מצאתי עוד 2 קישורים מעולים שיכולים לעזור לך ***********

    >> http://msdn.microsoft.com/en-us/library/jj653752(v=vs.110).aspx

    קישור מעולה שכולל הסברים על שרשרת ההתחברות כולל האשרויות השונות. פחות דוגמאות מהקישור ששמתי מעל אבל יותר הסברים מעולים.

    >> http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx

    קישור מעולה על כל המאפיינים של המחלקה SqlConnection.ConnectionString. ניתן גם לראות בקישור את ההברל על שימוש במסלול מוחלט או מסלוול יחסי בשרשרת ההתחברות במאפיין של AttachDBFilename


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Moderator יום ראשון 30 נובמבר 2014 21:51
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 02 דצמבר 2014 09:04
    יום ראשון 30 נובמבר 2014 18:14
    מנחה דיון
  • אהלן לאה,

    אני לא ממש מבין מה השאלות שנaארו פתוחות :-)
    אבל יש נקודה שעדיין לא מדוייקת. LOCALDB הוא לא מסד נתונים נתונים מוטבע. מסד הנתונים המוטבע של מיקרוסופט נקרא SQL Server Compact. לכן שימוש ב SQL Server Compact מאפשר לך לפתח אפליקציה בלי שהלקח יצתרך התקנה של דברים נוספים.

    SQL SERVER EXPRESS LOCALDB מחייב התקנה.
    SQL SERVER EXPRESS מחייב התקנה.
    SQL Server Compact לא מחייב התקנה, והוא מוטבע באפליקציה.



    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    • סומן כתשובה על-ידי lea_b יום חמישי 04 דצמבר 2014 08:28
    יום שלישי 02 דצמבר 2014 23:15
    מנחה דיון

כל התגובות

  • כדי לדעת למה נדרסת הרשומצה האחרונה אנחנו צריכים לראות את הקוד ולהבין מה את עושה :-)
    אנחנו לא יכולים לנחש

    לגבי השאלה ראשונה אני חושב שהקישור שנתן tetitu הוא מסביר את החלק של ההכנסה למסד נהתונים ובאותו מקום יש גם מדריך לשליפת הנתונים (לא בדקתי אם הוא טוב):
    http://geekswithblogs.net/dotNETvinz/archive/2010/03/11/fetching-data-from-database-and-populating-fields-in-the-form.aspx


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    • הוצע כתשובה על-ידי pituachMVP, Moderator שבת 29 נובמבר 2014 17:38
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 02 דצמבר 2014 09:03
    יום חמישי 27 נובמבר 2014 23:06
    מנחה דיון
  • ייבאתי כמובן את קובץ הMDF לתקיית הפרויקט ,

    כשאני מריצה מתוסף לי קובץ MDF גם בתקיית הBINN

    הקוד שלי :

     ExampleDBEntities E = new ExampleDBEntities();
                Student S = new Student { Id =6, Name = "DD", ClassId = 1 };
                E.Students.Add(S);
                E.SaveChanges();

    כאשר אני מריצה פעם ראשונה מתוסף לי שורה אחת לקובץ MDF שבתקיית הBIN,

    כאשר אני מריצה פעם נוספת(עם שינוי נתונים כמובן) השורה האחרונה נדרסת (גם בקובץ  MDF שבתקיית הBIN) , 

    קובץ הקונפיג שENTITY MODEL יצר לי:

     <connectionStrings>
        <add name="ExampleDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\ExampleDB.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
    נראה לי שאני צריכה לשנות את הגדרת קובץ הקונפיג, אבל מה בדיוק?

     
    יום ראשון 30 נובמבר 2014 12:24
  • את עבדת עם Entity Framework Code first ?

    תבדקי את הבלוג הבא אם כן, זה ייתן לך את ההסבר והפתרון, אם אני מניחש את הבעיה נכון:
    http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx

    * זה לא הקוד הרלוונטי היחיד, ייתכן שבמקרה זה צריך הרבה יותר מידע. אם תוכלי לצרף את הפרוייטק יהיה הכי קל. ייתכן שהבעיה קשורה להגדרות המחלקה שלך ב EF כפי שהבלוג מסביר מעל. במקרה המדוןבר בכל הרצה נוצר לנו למעשה מסד הנתונים מחדש ולכן נמחק הרשומה הקודמת :-) זו הבעיה הכי נפוצה


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    יום ראשון 30 נובמבר 2014 13:41
    מנחה דיון
  • ציטוט:

    "יתכן שהבעיה קשורה להגדרות המחלקה שלך ב EF כפי שהבלוג מסביר מעל. במקרה המדוןבר בכל הרצה נוצר לנו למעשה מסד הנתונים מחדש ולכן נמחק הרשומה הקודמת :-) זו הבעיה הכי נפוצה"

    זו אכן הבעיה, אבל לא השתמשתי עם CODE FIRST,

    איך מגדירים בקובץ הקונפיג שבמקום   DATA DIRECTORY הניגש לקובץ הMDF בתקיית הBIN אני רוצה לגשת לקובץ הנמצא בתקיית הפרויקט(מחוץ לתקיית הBIN)

    יום ראשון 30 נובמבר 2014 15:59
  • הסיבה שנוצר קובץ חדש כאשר לא עובדים בשיטת Code First, זה בדרך כלל פשוט כי הקובץ אינו קיים במקום שה VS מצפה למצוא אותו (זה משהו שקורה בתהליך של בניית הפרויקט ב VS).

    אתה שוכח שה BIN היא התקייה של הפרויקט הרץ, והתקייה מעל שאנחנו קוראים לה תקייה של הפרויקט היא רק לצרכי הפיתוח. בסיום הפיתוח קובץ ה EXE כאשר מייצרים אפליקציית הרצה למשל, יהיה בתקיית ה BIN בברירת המחדל. לכן זו התקיה של הבסיס של הפרויקט שלך במקרים אלו, כאשר אתה מריץ את הפרויקט ישירות ב VS.

    בכל מקרה אתה יכול לשנות את המסלול לקובץ בצורה ידנית בשרשרת ההתחברות. שים לב שיש לך שימוש בהגדרה הבאה:

    attachdbfilename=|DataDirectory|\ExampleDB.mdf;

    מה שזה אומר שהקובץ שלך נמצא במיקום יחסי (אתה רואה שהמיקום לא מתחיל בשם הכונן אלא ב קןו שמסמן "המקום הנוכחי" ואז נכנסים לתקייה בשם DataDirectory ושם נעשה שימוש בקובץ בשם ExampleDB.mdf), אתה יכול לעשות שימוש במיקום מוחלט ולא יחסי אם אתה רוצה.

    1. אני ממליץ בחום לא לעבוד בצורה כזו עם מסדי נתונים אלא לעבוד עם מסד נתונים שרץ ב Instance הראשי של שרת ה SQL. בניגוד לגרסאות בתשלום לגרסת ה SQL Express יש אפשרות לעבוד עם מה שנקראה Dynamic Instances או בשם אחר User Instances. זו שיטה מאוד לא מומלצת לדעתי! מה גם שבאפליקציה חיה אתה ככל הנראה תעבוד עם מסד נתונים שמוגדר בשרת, ולא כזה שיהיה בתקייה של הפרויקט.

    בקיצור הרעיון הוא לעזור עם מסד הנתונים בדיוק כמו שעובדים עם כל מסד נתונים אחר בשרת SQL בגרסה אחרת. זה גם יעזור לך להבין את הטעות בדיון בפורום האחר, ולהבין שאם את עובדת עם SQL EPRESS אז את התקנת את השרת (גם אם את לא יודעת שהוא מותקן).

    2. אם אתה כבר רוצה מסד נתונים שיהיה חלק מהפרויקט אז SQL Server Express לא מתאים מכיוון שהוא לא חלק מהפרויקט, הוא רק שומר את הקובץ בתקייה של הפרויקט אבל הוא רץ על השרת שמותקן. הדרך לעבודה עם מסד נתונים שהוא חלק מהפרויקט זה לעבוד עם מסדי נתונים מוטבעים (embedded database) באפליקציה כמו sqlite או SQL Server Compact. הה כבר מתקשר לדיון בפורום פיתוח WEB :-) שם יש עוד פרטים בנושא

    הקישור הבא יוכל לעזור בדוגמאות של כל האפשרויות של שרשרת התחברות למסד הנתונים SQL מכל הסוגים שלו:
    http://www.connectionstrings.com/sql-server-2012/

    2. בכל מקרה מומלץ להחליף את השימוש בשרת SQL Express המיושן בגישה שלו לשימוש בשרת גרסת ה LocalDB. רשמית מ 2012 זו ההמלצה של מיקרוסופט.

    ********** מצאתי עוד 2 קישורים מעולים שיכולים לעזור לך ***********

    >> http://msdn.microsoft.com/en-us/library/jj653752(v=vs.110).aspx

    קישור מעולה שכולל הסברים על שרשרת ההתחברות כולל האשרויות השונות. פחות דוגמאות מהקישור ששמתי מעל אבל יותר הסברים מעולים.

    >> http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx

    קישור מעולה על כל המאפיינים של המחלקה SqlConnection.ConnectionString. ניתן גם לראות בקישור את ההברל על שימוש במסלול מוחלט או מסלוול יחסי בשרשרת ההתחברות במאפיין של AttachDBFilename


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Moderator יום ראשון 30 נובמבר 2014 21:51
    • סומן כתשובה על-ידי Eran Sharvit יום שלישי 02 דצמבר 2014 09:04
    יום ראשון 30 נובמבר 2014 18:14
    מנחה דיון
  • שלום רונן, קודם כל תודה על ההתייחסות ועל התשובות המפורטות

    ציטוט:

    " אם אתה כבר רוצה מסד נתונים שיהיה חלק מהפרויקט אז SQL Server Express לא מתאים מכיוון שהוא לא חלק מהפרויקט, הוא רק שומר את הקובץ בתקייה של הפרויקט אבל הוא רץ על השרת שמותקן. הדרך לעבודה עם מסד נתונים שהוא חלק מהפרויקט זה לעבוד עם מסדי נתונים מוטבעים (embedded database) באפליקציה כמו sqlite או SQL Server Compact. "

    ישנה אפשרות ליצור תוכנה עם מסד נתונים  ללא התקנת SQL או כל שרת אחר חוץ מFRAMEWORK אצל הלקוח?

    או אנסח בצורה אחרת: שימוש  במסדי נתונים מוטבעים  ( כגון SQL SERVER EXPRESS LOCALDB 2012 אינו מחייב התקנה של שרת כלשהו על מחשב הלקוח? 

    אגב, בנוגע לSQL EXPRESS - בפעם הראשונה ששאלתי בפורום בהקשר לזה, אכן ענית לי תשובה מפורטת וציינת שSQL EXPRESS LOCAL DB 2012 זה אחד מהEMBEDDED DATABASE, אבל כנראה לא הבנתי נכון, ואני חשבתי שSQL EXPRESS שבVS 2012 הוא עצמו כבר LOCAL DB. וזה לא שני דברים נפרדים.

    יום שלישי 02 דצמבר 2014 16:40
  • אהלן לאה,

    אני לא ממש מבין מה השאלות שנaארו פתוחות :-)
    אבל יש נקודה שעדיין לא מדוייקת. LOCALDB הוא לא מסד נתונים נתונים מוטבע. מסד הנתונים המוטבע של מיקרוסופט נקרא SQL Server Compact. לכן שימוש ב SQL Server Compact מאפשר לך לפתח אפליקציה בלי שהלקח יצתרך התקנה של דברים נוספים.

    SQL SERVER EXPRESS LOCALDB מחייב התקנה.
    SQL SERVER EXPRESS מחייב התקנה.
    SQL Server Compact לא מחייב התקנה, והוא מוטבע באפליקציה.



    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    • סומן כתשובה על-ידי lea_b יום חמישי 04 דצמבר 2014 08:28
    יום שלישי 02 דצמבר 2014 23:15
    מנחה דיון