2012-01-19 67 views
1

我有實體框架和MySQL的問題。 我已經解決了實體框架功能參數問題this answer爲什麼在集合中找不到Mysql存儲過程參數?

但是,當我想用​​MySQL存儲過程添加一些數據我有

參數「kick_Prod_StateID」不是在集合中找到。

C#中的錯誤。

我的程序如下圖所示:

CREATE PROCEDURE CreateState_(

    IN kick_Prod_StateID INT(11), 
    IN kick_ShortName VARCHAR(3), 
    IN kick_StateName VARCHAR(50) 
) 

BEGIN INSERT INTO State_ 
(
    Prod_StateID_, 
    ShortName_, 
    StateName_ 
) 
VALUES 
( 
    kick_Prod_StateID , 
    kick_ShortName , 
    kick_StateName 
) ; 
END$$ 

和實體像下面框架創建的C#代碼:

public ObjectResult<State_> AddState(Nullable<global::System.Int32> prod_StateID_, global::System.String shortName_, global::System.String stateName_) 
    { 
     ObjectParameter prod_StateID_Parameter; 
     if (prod_StateID_.HasValue) 
     { 
      prod_StateID_Parameter = new ObjectParameter("Prod_StateID_", prod_StateID_); 
     } 
     else 
     { 
      prod_StateID_Parameter = new ObjectParameter("Prod_StateID_", typeof(global::System.Int32)); 
     } 

     ObjectParameter shortName_Parameter; 
     if (shortName_ != null) 
     { 
      shortName_Parameter = new ObjectParameter("ShortName_", shortName_); 
     } 
     else 
     { 
      shortName_Parameter = new ObjectParameter("ShortName_", typeof(global::System.String)); 
     } 

     ObjectParameter stateName_Parameter; 
     if (stateName_ != null) 
     { 
      stateName_Parameter = new ObjectParameter("StateName_", stateName_); 
     } 
     else 
     { 
      stateName_Parameter = new ObjectParameter("StateName_", typeof(global::System.String)); 
     } 

     return base.ExecuteFunction<State_>("AddState", prod_StateID_Parameter, shortName_Parameter, stateName_Parameter); 
    } 

在這一行==>

return base.ExecuteFunction<State_>("AddState", prod_StateID_Parameter, shortName_Parameter, stateName_Parameter); 

我該如何解決錯誤這個問題?

Thx

+0

請發佈相關的C#代碼,這可能是問題的原因 –

+0

您是否嘗試從INT聲明中刪除顯示寬度'(11)'? – Strillo

+0

@ThomasLevesque我已經編輯 – Bilgehan

回答

1

我解決了這個問題。

問題是存儲過程參數。

當我們一起使用mysql和實體框架時,我們應該爲表和值參數賦予相同的名稱。

我指的是存儲過程應該是:

CREATE PROCEDURE CreateState_(

IN Prod_StateID_ INT(11), 
IN ShortName_ VARCHAR(3), 
IN StateName_ VARCHAR(50) 
) 

BEGIN INSERT INTO State_ 
(
Prod_StateID_, 
ShortName_, 
StateName_ 
) 
VALUES 
( 
Prod_StateID_ , 
ShortName_ , 
StateName_ 
) ; 
END$$ 
+0

嗨,如果我創造了我的表如下'分隔符$$ CREATE TABLE tbluser( 用戶ID INT(11)NOT NULL, 姓VARCHAR( 45)DEFAULT NULL, 用戶名VARCHAR(45)DEFAULT NULL, 密碼VARCHAR(45)DEFAULT NULL, 性別VARCHAR(45)DEFAULT NULL, 名字VARCHAR(45)DEFAULT NULL, PRIMARY KEY(用戶ID) )'那麼我怎麼可以按照你所說的來寫例行程序 – Dotnet

1

還有另一種解決方案EDMX添加或刪除,如「P_」或刪除一些字符作爲你的情況「kick_」的一些內容。

確保存儲過程和edmx函數中參數的名稱保持不變。如果它們不同使它們相同。

MySql的過程:


CREATE CommentsDelete(TCommentId int) 
BEGIN 

delete from SmComment where Commentid in 
(
select commentid from smcomment where parentid= TCommentId or commentid=TCommentId; 
); 
END 

首先EDMX創造了這個功能:

public int CommentsDelete(Nullable<global::System.Int32> p_CommentId) 
     { 
      ObjectParameter p_CommentIdParameter; 
      if (p_CommentId.HasValue) 
      { 
       p_CommentIdParameter = new ObjectParameter("p_CommentId", p_CommentId); 
      } 
      else 
      { 
       p_CommentIdParameter = new ObjectParameter("p_CommentId", typeof (global::System.Int32)); 
      } 

      return base.ExecuteFunction("RecursiveCommentsDelete", p_CommentIdParameter); 
     } 

我替換 「p_CommentId」 與 「TCommentId」 現在這對我來說是

工作正常Edmx Designer功能:

public int CommentsDelete(Nullable<global::System.Int32> p_CommentId) 
     { 
      ObjectParameter p_CommentIdParameter; 
      if (p_CommentId.HasValue) 
      { 
       p_CommentIdParameter = new ObjectParameter("TCommentId", p_CommentId); 
      } 
      else 
      { 
       p_CommentIdParameter = new ObjectParameter("TCommentId", typeof (global::System.Int32)); 
      } 

      return base.ExecuteFunction("RecursiveCommentsDelete", p_CommentIdParameter); 
     }