11

मैं EntityFramework जो टेबल मूल्य पैरामीटर का उपयोग करता से एक संग्रहीत प्रक्रिया कॉल करने के लिए कोशिश कर रहा हूँ।EntityFrameWork और TableValued पैरामीटर

लेकिन जब मैं समारोह आयात करने की कोशिश मैं कह रहा एक चेतावनी संदेश प्राप्त हो रही है -

समारोह 'InsertPerson' पैरामीटर सूचकांक 0 में एक पैरामीटर 'InsertPerson_TVP' एक डेटा प्रकार है कि है 'तालिका प्रकार 'वर्तमान में लक्ष्य .NET Framework संस्करण के लिए समर्थित नहीं है। समारोह को बाहर रखा गया था।

मैं यहाँ एक प्रारंभिक खोज किया था और कुछ पदों जो कहते हैं यह कुछ काम arounds के साथ EntityFrameWork में संभव है और few हुए कहा कि यह वर्तमान संस्करण में समर्थित नहीं है पाया।

क्या कोई इस समस्या के लिए बेहतर दृष्टिकोण या समाधान जानता है?

+1

एफई TVP समर्थन नहीं करता। यदि आपको कोई कामकाज मिल गया है तो बस इसे आज़माएं या टीवीपी के साथ संग्रहीत प्रक्रिया को कॉल करने के लिए ईएफ का उपयोग न करें। –

उत्तर

16

मैं यह कर समाप्त हो गया, कृपया ध्यान दें कि उत्पादन पैरामीटर के साथ एक संग्रहीत प्रक्रिया निष्पादित एफई DataContext (नहीं ObjectContext)

पर काम कर रहे

 using (DataContext context = new DataContext()) 
     {     
      ////Create table value parameter 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Displayname"); 
      dt.Columns.Add("FirstName"); 
      dt.Columns.Add("LastName"); 
      dt.Columns.Add("TimeStamp"); 

      DataRow dr = dt.NewRow(); 
      dr["Displayname"] = "DisplayName"; 
      dr["FirstName"] = "FirstName"; 
      dr["LastName"] ="LastName"; 
      dr["TimeStamp"] = "TimeStamp";    
      dt.Rows.Add(dr); 

      ////Use DbType.Structured for TVP 
      var userdetails = new SqlParameter("UserDetails", SqlDbType.Structured); 
      userdetails.Value = dt; 
      userdetails.TypeName = "UserType"; 

      ////Parameter for SP output 
      var result = new SqlParameter("ResultList", SqlDbType.NVarChar, 4000); 
      result.Direction = ParameterDirection.Output; 

      context.Database.ExecuteSqlCommand("EXEC UserImport @UserDetails, @ResultList OUTPUT", userdetails, result); 

      return result == null ? string.Empty : result.Value.ToString(); 
     } 

मेरे टेबल मूल्य पैरामीटर (यूडीटी टेबल) स्क्रिप्ट इस तरह दिखती है:

CREATE TYPE [dbo].[UserType] AS TABLE (
    [DisplayName]  NVARCHAR (256) NULL, 
    [FirstName]  NVARCHAR (256) NULL, 
    [LastName]   NVARCHAR (256) NULL, 
    [TimeStamp]  DATETIME   NULL 
    ) 

और मेरे दुकान प्रक्रियाoutput पैरामीटर हम किसी भी ouput पैरामीटर जोड़ा/एसपी को पास किए जाने की जरूरत नहीं है बिना संग्रहित प्रक्रिया के लिए की तरह

CREATE PROCEDURE UserImport 
-- Add the parameters for the stored procedure here 
@UserDetails UserType Readonly, 
@ResultList NVARCHAR(MAX) output 
AS 

शुरू होता है।

उम्मीद है कि यह किसी की मदद करता है।

+0

डॉ का तत्काल कहां है? मुझे DataRowBuilder के सुरक्षा स्तर के कारण त्रुटियां मिल रही हैं। – JSideris

+1

@Bizorke संपादित कोड। – ssilas777

+0

आपके कार्य को यूडीटी (उपयोगकर्ता परिभाषित प्रकार) नहीं है और यूडीएफ (उपयोगकर्ता परिभाषित फ़ंक्शन नहीं) है? – Dementic

4

शायद हम भी SqlQuery विधि पर विचार कर सकता है:

[Invoke] 
public SomeResultType GetResult(List<int> someIdList) 
{ 
    var idTbl = new DataTable(); 
    idTbl.Columns.Add("Some_ID"); 

    someIdList.ForEach(id => idTbl.Rows.Add(id)); 

    var idParam = new SqlParamter("SomeParamName", SqlDbType.Structured); 
    idParam.TypeName = "SomeTBVType"; 
    idParam.Value = idTbl; 

    // Return type will be IEnumerable<T> 
    var result = DbContext.Database.SqlQuery<SomeResultType>("EXEC SomeSPName, @SomeParamName", idParam); 

    // We can enumerate the result... 

    var enu = result.GetEnumerator(); 
    if (!enu.MoveNext()) return null; 
    return enu.Current; 
} 
1
  var detailTbl = new DataTable(); 
     detailTbl.Columns.Add("DetailID"); 
     detailTbl.Columns.Add("Qty"); 
     txnDetails.ForEach(detail => detailTbl.Rows.Add(detail.DetailID, detail.Qty)); 

     var userIdParam = new System.Data.SqlClient.SqlParameter("@UserID", SqlDbType.Int); 
     userIdParam.Value = 1; 

     var detailParam = new System.Data.SqlClient.SqlParameter("@Details", SqlDbType.Structured); 
     detailParam.TypeName = "DetailUpdate"; 
     detailParam.Value = detailTbl; 

     var txnTypeParam = new System.Data.SqlClient.SqlParameter("@TransactionType", SqlDbType.VarChar); 
     txnTypeParam.Value = txnType; 

     var result = await db.Database.ExecuteSqlCommandAsync("MySP @UserID, @Details, @TransactionType", userIdParam, detailParam, txnTypeParam); 
     if(result >= 0) 
      return StatusCode(HttpStatusCode.OK); 
     else 
      return StatusCode(HttpStatusCode.InternalServerError);