2016-03-24 14 views
0

ストアドプロシージャをデータベースのビューで表されるEFエンティティにマッピングする際に問題があります。ストアドプロシージャをビューにマッピングする

私は、例えば、.Addメソッドを呼び出そうとした場合 - エラーに

を取得するパラメーターが多すぎます...

私はEFでのすべてのパラメータを望んでいることを、/理解して知っていますエンティティは、マップされたAdd - ストアドプロシージャのキー(+計算)を除きます。しかし、 "entity = view"の場合、私はストアドプロシージャのパラメータとして、私はdbテーブル(挿入の場合は1つのフィールドセット、別のセットの場合は更新、削除の場合は3番目のセット)。

これを行う方法「正しい」ですか? .edmxでこの(グラフィックインターフェースを介してマッピングは)完璧に動作しますが、私は手でコード-最初にこの動作を実現する必要がある。..

例:DB内

ビュー..

CREATE VIEW vDepartment 
AS 
    SELECT 
     d.*, 
     dp.Code as ParentCode, dp.SName as ParentSName, 
     dp.Name as ParentName 
    FROM 
     Department d 
    LEFT OUTER JOIN 
     Department dp ON d.ParentID = dp.ID 

EFエンティティ

public partial class vDepartment 
{ 
    public long ID { get; set; } 
    public Nullable<long> ParentID { get; set; } 
    public string Code { get; set; } 
    public string SName { get; set; } 
    public string Name { get; set; } 
    public Nullable<System.DateTime> CloseDate { get; set; } 
    public string ParentCode { get; set; } 
    public string ParentSName { get; set; } 
    public string ParentName { get; set; } 
} 

マッピング..

modelBuilder.Entity<vDepartment>().MapToStoredProcedures(s => 
      { 
       s.Update(u => u.HasName("udp_Department_upd")); 
       s.Delete(d => d.HasName("udp_Department_del")); 
       s.Insert(i => i.HasName("udp_Department_ins").Result(r => r.ID, "NewID")); 
      }); 

挿入データベースにストアドプロシージャ:

CREATE PROC [dbo].[udp_Department_ins] 
    @ParentID BIGINT, 
    @Code  NVARCHAR(20), 
    @SName  NVARCHAR(50), 
    @Name  NVARCHAR(100), 
    @CloseDate DATE 
AS 
BEGIN 
    DECLARE @NewID bigint; 

    INSERT INTO Department... 
     SELECT @NewID AS NewID; 
END; 
+0

ストアドプロシージャを定義するときに、ストアドプロシージャごとにパラメータを定義するオプションが増えますか? – Brad

+0

私はそのように説明しようとしましたが、同じエラーがあります。 (e => e.Code、 "Code") .Parameter(e => e.ParentID、 "ParentID") .Parameter(e => e.Code、 "Code")。 => e.SName、 "SName") .Parameter(e => e.Name、 "Name") .Parameter(e => e.CloseDate、 "CloseDate") 。Result(r => r.ID 、 "NewID") ); – Valerdos

+0

データベースの最初のシステムにコードを最初に近づけようとしています。私の経験では、エンティティへのビューのマッピングは常に一方向(POCOのデータベース)であり、ストアドプロシージャを使用した挿入、更新、または削除は含まれていません。私は、あなたの挿入された挿入procのパラメータだけをマッピングするプロパティを含むPOCOを作成することを提案します。しかし、これはコードの最初の方法ではなく、不要な複雑さをデータレイヤに追加します。 – Brad

答えて

0

あなたが行うことができます:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ParentSName { get; set; } 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ParentName { get; set; } 

をあなたのストアドプロシージャにパラメータとして提供されるようにParentSNameとParentNameを防ぐために。これは、これらの列がデータベース内の実際の計算列でなければならないことを意味しないことに注意してください。効果的に、それらをEFには更新不可/読み取り専用ではないとマークします。

edmxデザイナーのように、特定のストアドプロシージャのパラメータを無視するようにマッピングに指示する直接の方法が見つかりませんでした。

また、計算された列をストアドプロシージャの出力として追加することを忘れないでください。更新時にこれらの値がデータベース内で変更される場合、これは必要な場合としない場合があります。

s.Insert(i => i.HasName("udp_Department_ins").Result(r => r.ID, "NewID").Result(r => r.ParentName , "ParentName") 
関連する問題