none
האם יש אפשרות בEntity Framework לשלוח לפרוצ' שמקבלת כפרמטר datatable? RRS feed

כל התגובות

  • לא ברור לי מה הכוונה. פונקציה יכולה כפרטר כל דדבר שאתה רוצה בערון דוט-נט. ה INPUT יכול להיות גם אובייקט מורכב.

    אני לא בטוח למה אתה מתכוון. אתה יכול לפרט מעט?


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


    יום שני 25 ספטמבר 2017 19:13
    מנחה דיון
  • פירוט:

    יש לי פרוצדורה שמקבלת כפרמטר טבלה.

    אני משתמש 

    בEntity Framework

    מהקוד כדי לגשת לפרוצדורה הזו.

    הבעיה שהאנטטי לא מכיר את הפרמטר הטבלאי, אלא רק פרמטרים רגילים.

    מצאתי פיתרון כאן- שאפשר לשלוח סטרינג  של XML לפרוצ' במקום טבלה

    ואז בפרוצדורה מפענחים אותו לטבלה.

    אם יש משו יותר נורמלי אשמח לשמוע

    זה הלינק:

    https://social.msdn.microsoft.com/Forums/en-US/29bcd888-6d79-4f60-8858-3a11a650018b/tablevalued-parameter-in-stored-procedure-and-the-entity-framework-40?forum=adodotnetentityframework

    תודה על התגובה

    יום שלישי 26 ספטמבר 2017 04:23

  • התשובה הקצרה היא כן

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

    >> מצאתי פיתרון כאן- שאפשר לשלוח סטרינג  של XML לפרוצ' במקום טבלה

    הנקודה הכי חשובה!!!!

    הפתרון שמצאת נכתב בשנת 2014 ואנחנו היום בסוף שנת 2017

    שלוש שנים במחשבים זה כמו 30 שנים בחיי אנשים!!!
    אתה לא יכול להסתכל על פתרון מלפני שלוש שנים ולחשוב שזה מה שיש לנו היום :-)

    * השאלה נשאלה על גרסת EF 4.0 וכבר בגרסת 4.5 נוספה התמיכה ב Table-Valued Parameters. היום אנחנו כבר בגרסה הרבה יותר מתקדמת.

    >> יש לי פרוצדורה שמקבלת כפרמטר טבלה

    פרוצדורה יכולה לקבל Table-Valued Parameters
    אני בטוח לפי ההסבר שזה הכוונה שלך
    שימוש במושגים נכונים גם מועיל בפורום כדי להבין את הכוונה וזה גם עוזר למצוא פתרון בחיפוש במנוע חיפוש כצו גוגל :-)

    עתה כאשר אתה מכיר את המושג הנכון את יכול פשוט לחפש בגוגל את המילים הבאות ולקל מאות קישורים לדוגמאות פשוטות למימוש:
    table valued parameters entity framework

    >> הבעיה שהאנטטי לא מכיר את הפרמטר הטבלאי, אלא רק פרמטרים רגילים.

    אני ממליץ לא לכתוב מילים באנגלית בעזרת אותיות בעברית. כדאי להכיר את הקיצור המקובל עבור Entity Framework שהוא פשוט שימוש באותיות EF :-)

    ולגבי הבעיה שלך, אם נחבר את 2 הנקודות מעל הרי שחיפוש בגוגל יוביל אותך למסקנה שאתה טועה :-)
    EF תומך בעבודה עם table valued parameters

    מתוך החיפוש בגוגל הנה דוגמה ראשונה למשל :-)
    http://www.c-sharpcorner.com/uploadfile/78607b/using-table-valued-parameters-in-entity-framework/

    אני מקווה שזה נותן את התשובה :-)


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




    יום שלישי 26 ספטמבר 2017 11:13
    מנחה דיון
  • תודה רבה על התגובה המפורטת

    אמנם הEF תומך בTVP, אבל לא בדרך הרגילה שלו לעבוד, ז"א ע"י גישה מהקוד לפונקציה שבתוך ה Contexts של הDBModel.Designer.cs

    אלא לפי מה שקראתי גם בלינק ששלחת, זה ע"י גישה ישירה לפרוצדורה שבDB,

    1. using (SampleDbEntities db = new SampleDbEntities())  
    2. {  
    3. db.Database.ExecuteSqlCommand("exec dbo.usp_SaveStudents @students", parameter);  
    4. }  

    ולא בדרך הרגילה שלו לעבוד, ז"א אין לEF מעטפפת מסודרת לטיפול בפרמטר מסוג TVP.

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

    לדוג'-

    בשליחה מהקוד-

    DB.InsertLogRecord((int)logType, ((int)type).ToString(), DateTime.Now, UserName, title)

    בContexts זה נכתב אוטומטי מהEF

    public int InsertLogRecord(Nullable<global::System.Int32> in_LogType, global::System.String in_ActionType, Nullable<global::System.DateTime> in_InputDate, global::System.String in_UserName, global::System.String in_Title, global::System.String in_MethodName, global::System.String in_Description, global::System.String in_BrowserType, global::System.String in_SessionId, global::System.String in_Page, Nullable<global::System.Int64> in_BavliInventoryId, Nullable<global::System.Int64> in_ImgComputedIX, Nullable<global::System.Int64> in_VilnaAmudId)
        {
            ObjectParameter in_LogTypeParameter;
            if (in_LogType.HasValue)
            {
                in_LogTypeParameter = new ObjectParameter("in_LogType", in_LogType);
            }
            else
            {
                in_LogTypeParameter = new ObjectParameter("in_LogType"typeof(global::System.Int32));
            }
     
            ObjectParameter in_ActionTypeParameter;
            if (in_ActionType != null)
            {
                in_ActionTypeParameter = new ObjectParameter("in_ActionType", in_ActionType);
            }
            else
            {
                in_ActionTypeParameter = new ObjectParameter("in_ActionType"typeof(global::System.String));
            }
     
            ObjectParameter in_InputDateParameter;
            if (in_InputDate.HasValue)
            {
                in_InputDateParameter = new ObjectParameter("in_InputDate", in_InputDate);
            }
            else
            {
                in_InputDateParameter = new ObjectParameter("in_InputDate"typeof(global::System.DateTime));
            }
     
            ObjectParameter in_UserNameParameter;
            if (in_UserName != null)
            {
                in_UserNameParameter = new ObjectParameter("in_UserName", in_UserName);
            }
            else
            {
                in_UserNameParameter = new ObjectParameter("in_UserName"typeof(global::System.String));
            }
     
            ObjectParameter in_TitleParameter;
            if (in_Title != null)
            {
                in_TitleParameter = new ObjectParameter("in_Title", in_Title);
            }
            else
            {
                in_TitleParameter = new ObjectParameter("in_Title"typeof(global::System.String));
            }
             return base.ExecuteFunction("InsertLogRecord", in_LogTypeParameter, in_ActionTypeParameter, in_InputDateParameter, in_UserNameParameter, in_TitleParameter, in_MethodNameParameter, in_DescriptionParameter, in_BrowserTypeParameter, in_SessionIdParameter, in_PageParameter, in_BavliInventoryIdParameter, in_ImgComputedIXParameter, in_VilnaAmudIdParameter);
        }

    ומה שאני מחפש זה שאם הפרוצ' שלי בDB מקבלת פרמטר מסוג TVP

    הEF ידע לחולל את זה

    אם אני צריך לגשת ישירות לEF מהקוד זה גורם לי לסוג כתיבה שונה בתוך הקוד, וכתיבת שם הפרוצ' ממש לא דרך הEF וזה היה נראה לי לא מספיק תקין,

    אבל אם זה התשובה, אז נראה לי שאצטרך לשקול מה עדיף - האם שימוש בXML וחילוץ ממנו, או שליחה לפרוצ' עצמה מהקוד.

    יום רביעי 27 ספטמבר 2017 06:35
  • אין הרבה מה לחשוב בנושא ההבדלים מבחינת ביצועים הם משמעותיים מאוד!

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

    * כדי להבין מה מתאים צרכיך להכיר את המערכת בצורה מעמיקה אבל לכל הפחות צריך לראות את הפרוצדורה בה אתה עובד. במבט ראשוני כברירת מחדל עבודה עם TVP הרבה יותר טובה ככלל זהב מעבודה עם טקסט וניתוח שלו


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

    יום רביעי 27 ספטמבר 2017 07:12
    מנחה דיון