0

では動作しません。私は正しくAddVideoと呼ばれる関数にマップされたストアドプロシージャをインポートすることができましたが、この関数を実行すると、なぜそれができるのかわからないSystem.ArgumentException例外がスローされます。ストアド・プロシージャは、私はOracleのストアドプロシージャを呼び出すしようとすると、私は問題を抱えているEntity Frameworkのデータベース - 最初のワークフロー

これは、Oracleでの私のストアドプロシージャです:

create or replace procedure SP_ADD_VIDEO 
    (p_name in varchar2, p_release_date in date, p_genre in varchar2) 
is 
    genreId number; 
    maxVideoId number; 
begin 
    select G.ID into genreId 
    from GENRES G 
    where G.NAME = p_genre; 

    insert into VIDEOS(ID, NAME, RELEASEDATE) 
    values(SEQ_VIDEOS.NEXTVAL, p_name, p_release_date); 

    select MAX(V.ID) into maxVideoId 
    from VIDEOS V; 

    insert into VIDEOGENRES(VIDEOID,GENREID) 
    values(maxVideoId,genreId); 
end SP_ADD_VIDEO; 

そして、これが私のマッピングされた機能である:

public virtual int AddVideo(string p_NAME, Nullable<System.DateTime> p_RELEASE_DATE, string p_GENRE) 
{ 
    var p_NAMEParameter = p_NAME != null ? 
     new ObjectParameter("P_NAME", p_NAME) : 
     new ObjectParameter("P_NAME", typeof(string)); 

    var p_RELEASE_DATEParameter = p_RELEASE_DATE.HasValue ? 
     new ObjectParameter("P_RELEASE_DATE", p_RELEASE_DATE) : 
     new ObjectParameter("P_RELEASE_DATE", typeof(System.DateTime)); 

    var p_GENREParameter = p_GENRE != null ? 
     new ObjectParameter("P_GENRE", p_GENRE) : 
     new ObjectParameter("P_GENRE", typeof(string)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("AddVideo", p_NAMEParameter, p_RELEASE_DATEParameter, p_GENREParameter); 
} 

そして、私はへのパラメータとして与えられた値を挿入するAddVideo関数を呼び出す場所ですストアドプロシージャ:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dbContext = new VidzyDbContext(); 
     dbContext.AddVideo("Gladiator", DateTime.Today, "Action"); 
    } 
} 

私は誰かが私を解決するのを助けることを願っています問題。

+0

私はOracleと0 EXPを持っていますが、小文字にごAddViedeo方法であなたのパラメータの名前を変更してみてください。 E、g、 "P_NAME" - > "p_name"これらはあなたのsprocのあなたのパラメータの名前です。 – tshoemake

+0

あなたのプロシージャの名前は 'SP_ADD_VIDEO'であり、あなたの呼び出しには' AddVideo'があります。この行は次のように読んでください: 'return((IObjectContextAdapter)this).ObjectContext.ExecuteFunction(" SP_ADD_VIDEO "、p_NAMEParameter、p_RELEASE_DATEParameter、p_GENREParameter);' –

答えて

0

それはOracleのために働くならば、私は言うことはできませんが、MSSQLで、あなたがこれを行う必要があるだろう:

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction(
    "SP_ADD_VIDEO @P_NAME, @P_RELEASE_DATE, @P_GENRE", 
    p_NAMEParameter, p_RELEASE_DATEParameter, p_GENREParameter); 

あなたのパラメータを作成しますときに、あなたが行う際に、@を入れないで続けますnew ObjectParameter...です。

私はいつも、データベースのようなコードで同じ筐体で、私のパラメータ名を持っていたので、私はあなたがデータベースかどうかに一致するように、コードに小文字に調整する必要があるかはわかりません。

関連する問題