2009-04-26 18 views
9

以下に貼り付けた単純なパラメータのないストアドプロシージャを作成しました。ストアドプロシージャをエンティティモデルにインポートし、関数インポートを作成しました。モデル内の関数は決して作成されず、ADO.NET Entity Frameworkを使用してこのストアドプロシージャを実行することができません。 XMLビューで.edmxファイルを開き、このストアドプロシージャに関するエラーがないことを確認しました。私は間違って何をしていますか? Entity Frameworkからこのような単純なストアドプロシージャを呼び出すことは本当に不可能ですか?インポート関数の戻り値の型をNoneに設定しました。このストアドプロシージャがレコードセットまたは値を返す必要はありません。私はそれが特定の関連付けられている場合を除き、あなたがEFモデルにストアドプロシージャを追加することができるとは思わないADO.NET Entity Frameworkでストアドプロシージャを実行できません

Dim db As New MilkModel 

db.Inventory_Snapshot_Create() 

答えて

6

ありがとう、pmarflee。

私は実際にこれに私の解決策を投稿するためにここに来て、あなたの応答を同時に見ました。このコードは実際にエンティティ・フレームワークの接続を使用し、モデルにインポートしたストアド・プロシージャを実行します。 MicrosoftはLINQ to SQLや他のDALジェネレータの代わりにEntity Frameworkを使用するよう開発者に依頼していますが、EF は実際にはである必要はありません。より完全な解決策になるまで、今後のプロジェクトでは使用しません。あなたは[インポート機能、エンティティコンテナに行き、

Dim db As New MilkModel 

'== 
'Begin dirty hack to execute parameterless/resultless stored 
'procedure using Entity Framework (well, sort of using EF). 
'http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/44a0a7c2-7c1b-43bc-98e0-4d072b94b2ab/ 
'== 
Dim con As DbConnection = db.Connection 

con.Open() 

Dim cmd As DbCommand = con.CreateCommand() 

With cmd 
    .CommandType = CommandType.StoredProcedure 
    .CommandText = "MilkModel.Inventory_Snapshot_Create" 
    .ExecuteNonQuery() 
    .Dispose() 
End With 

con.Dispose() 
'== 
'End dirty hack 
'== 
+0

回避策をお寄せいただきありがとうございます。私はあなたがこれを使ってストアドプロシージャを呼び出せないとは信じられません。しかし、pmarfleeが述べたように、EF内のテーブルを変更している場合は、そのテーブルを使用することは想定されていません。 – greektreat

+2

ハックの必要はありません:http://msdn.microsoft.com/en-us/library/bb896231.aspx –

3

:ストアドプロシージャを実行しようとしている

ALTER PROC [dbo].[Inventory_Snapshot_Create] 

AS 

SET NOCOUNT ON 

DECLARE @Inventory_Snapshot_ID int 

INSERT INTO Inventory_Snapshots (snapshot_timestamp) 
VALUES (GETDATE()) 

SET @Inventory_Snapshot_ID = SCOPE_IDENTITY() 

INSERT INTO Inventory_Snapshot_Products (inventory_snapshot_id, 
    idProduct, stock) 

    SELECT @Inventory_Snapshot_ID, idProduct, stock 
    FROM products 


SET NOCOUNT OFF 

コード:ストアドプロシージャ

エンティティに対するCRUD操作。ただし、エンティティコンテナオブジェクトの接続プロパティを参照すると、EFが使用している基になるADO.NET接続オブジェクトにアクセスできます。従来のADO.NETコードを使用してストアドプロシージャを呼び出すことができます。

+2

それは本当に吸う。 –

11

まずあなたがモデルに追加します。

は、ここに私がやってしまったものです。ここ

完全な詳細:

http://msdn.microsoft.com/en-us/library/bb896231.aspx

+0

これはまったく正しいです。ここで不快なハッキングをする必要はありません。ドキュメントを読むだけでいいです。 – Stuart

0

たDbCommandを使用しないようにしたい場合は、私はそれはSPがエンティティ定義と一致した列のいくつかのセットを返すことによって、働かせました。

4

任意のストアドプロシージャは、EFを通じて呼び出すことができます。 SPを作成してモデルに追加します。さらにモデルブラウザでspを右クリックし、関数の追加をクリックします。ここでSPを選択し、何が返されるかを選択します。何も返されない場合はNoneを選択します。 sclar型を返す場合は型を選択し、レコードセットを返す場合は複合型を選択します。 get列情報をクリックすると、列が返されます。新しい複合型の作成をクリックします。 [OK]をクリックします。あなたのエンティティのうちの1つを返す場合は、オプションエンティティをクリックし、リストボックスからエンティティタイプを選択します。

あなたのコードでこのコードを呼び出します。

その複合型の使用コードを返す場合:

MyEntities _entities = new MyEntities(); var p = from d in _entities.GetOrderInfo() select d;

その戻って何が、その後のコードを使用しない場合:さらにクエリのため MyEntities _entities = new MyEntities(); _entities.Cancel_Sale(ucode, oid);

には

http://dubeyniraj.blogspot.com/

+0

EF5以降を使用している場合は、関数のインポートはありません。関数のインポートを行わずに直接アクセスできます。 – Niraj

1

をご覧ください。他の誰かがこれについて不思議に思っている...

ストアドプロシージャとEntity Frameworkの主な問題は、戻り値の型を定義する必要があることです。たとえば、テーブルからsoem行を返すストアドプロシージャがある場合は、Entity Frameworkにその行の構造がどのように表示されるかを伝える必要があります。これは、すべてのプロキシクラスを生成して、シリアライズしてデシリアライズできるようにするために必要です。

model-rigktクリックインポート関数を使用すると、ストアドプロシージャを選択できますが、返されるデータ型がnone、スカラー、またはエンティティタイプ(データベース内のテーブルに基づいています) 。必要に応じて、複雑なタイプを追加することができます。右クリックモデル - 追加 - 複合タイプを選択します。次に、列とそのデータ型を定義します。

これが完了すると、先ほど作成したクラスが上記のエンティティタイプのリストの下に表示されます。

1

私のプロジェクトではFirebirdSql DBを実際に使用していますが、これはEntity Frameworkにとって本当に正しいのであれば私は気にしません。

しかし、とにかくI(関数)がいくつかの挿入操作を含むストアドプロシージャをインポートすると、何らかの理由で何も起こりません。言い換えれば、私は私のモデル(EDCX)などSPに追加した場合:

create procedure insert_stuff(thing varchar(40)) 
returns response(50) 
as 
begin 
    insert into stuffs(thing) values (thing); 

    response = 'done!'; 

    suspend; 
end; 

、その後、私はこの方法でそれを呼び出す:

FirebirdContext.InsertStuff("Hi there!"); // it should return an ObjectResult<String> 
FirebirdContext.SaveChanges(); 

も何も実際には起こりません。全く何もない。例外も結果も挿入も、完璧です、警告もコンパイルエラーもありません。面白いのは、私がストアドプロシージャのスクリプトに削除を入れると、削除が動作するということです!しかし、挿入はありません!

テーブルは非常にシンプルですが、すでに他のストアドプロシージャをインポートして動作していますが、クエリ、更新、削除が含まれているため、 Firebird Ado.NET Providerのバグでしょうか?それとも私が逃したものをセットしなければならないのですか?

関連する問題