2016-03-30 6 views
1

私はFileという名前のモデルを持っています.CritatedOnとModifiedOnはテーブルFileの列CreatedOnとModifiedOnにマップされています。これらの列の値をユーザーが設定する必要はなく、SQLのGETDATE()関数を使用して設定されます。Entity Frameworkコードファースト:モデルプロパティより少ないパラメータでストアドプロシージャにマップする方法?

これは、(テストのために簡略化)私のモデルである:

public class File 
{ 
    public int? Id { get; set; } 
    public DateTime? CreatedOn { get; set; } 
    public string Name { get; set; } 
    public DateTime? ModifiedOn { get; set; } 
} 

ストアドプロシージャへの私のモデルマッピング:私のコードで、次の

public class FileMap: EntityTypeConfiguration<File> 
{ 
    public FileMap() 
    { 
     MapToStoredProcedures(s => s.Insert(i => i.HasName("InsertFile").Parameter(f => f.Name, "Name"))); 
    } 
} 

マイ移行:

public partial class AddInsertStoredProcedure: DbMigration 
{ 
    public override void Up() 
    { 
     CreateStoredProcedure(
      "dbo.InsertFile", 
      p => new 
      { 
       Name = p.String(), 
      }, 
      body: 
       @"INSERT [dbo].[Files]([CreatedOn], [ModifiedOn], [Name]) 
        VALUES (GETDATE(), GETDATE(), @Name) 

        DECLARE @Id int 
        SELECT @Id = [Id] 
        FROM [dbo].[Files] 
        WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() 

        SELECT t0.[Id] 
        FROM [dbo].[Files] AS t0 
        WHERE @@ROWCOUNT > 0 AND t0.[Id] = @Id" 
      ); 
    /* ... */ 
} 

私のテストクラス:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var context = new EntityContext(); 
     context.Files.Add(new File { Name = "File 1" }); 
     context.Files.Add(new File { Name = "File 2" }); 
     context.Files.Add(new File { Name = "File 3" }); 
     context.Files.Add(new File { Name = "File 4" }); 
     context.SaveChanges(); 
     Console.WriteLine("Done"); 
     Console.ReadLine(); 
    } 
} 

実行中に例外が発生しました{"プロシージャまたは関数InsertFileの引数が多すぎます。"}。 EFは私のモデルのすべてのプロパティをストアドプロシージャのInsertFileに渡したので、余分な引数があるようです。 EFにプロパティNameだけを渡すことはできますか?

+0

のために、このようなものを持っていますMapToStoredProcedures(s => s.Insert(i => i.HasName( "InsertFile"))。パラメータ(f => f.Name、 "Name")));パラメータを「Name」に名前を付ける必要はありません。名前はすでに名前であるため、パラメータを削除します。 EFがすべてのパラメータを通過していることをどのように知っていますか? SQLの出力はありますか? –

+0

とても素敵な質問ですが、私はこれを次のように説明します。興味のあるものは何ですか...選択したものは何をしていますか?あなたがSQLでデバッグしていたときにそれが何であるかを見ることができません。 – Seabizkit

+0

いいえ、EFがすべてのパラメータを渡していることはわかりません。私は例外メッセージの内容を完全に理解しています。私はコンテキストオブジェクトのSaveChangeds()メソッドにデバッグすることができないので、どこに問題があるのか​​正確にはわからない。プログラムはcontext.SaveChanges()でDbUpdateExceptionで破損しています –

答えて

0

あなたは、彼らは、ストアドプロシージャ、属性に必要ないけない場合、あなたの特性に追加してみてください。あなたは、ストアドプロシージャの使用からあなたのプロパティを取得したい場合は

[DatabaseGenerated(DatabaseGeneratedOption.None)] 

流暢で
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 

とマップ例えば

public FileMap() 
    { 
     MapToStoredProcedures(s => s.Insert(i => i.HasName("InsertFile").Parameter(f => f.Name, "Name").Result(f => f.ModifiedOn,"ModifiedOn")); 
} 

、I'amはこのために使用するもの:

このような.API

モデル:

public partial class Order 
{ 
    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int MasterFID { get; set; } 

    [Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public int ID { get; set; } 

    [StringLength(50)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public string Number { get; set; } 

    public int? OutletID { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public DateTime? OrderDate { get; set; } 

    [StringLength(250)] 
    public string Comment { get; set; } 

    public decimal? Sum { get; set; } 

Fluent.Apiマッピング:

modelBuilder.Entity<Order>() 
       .MapToStoredProcedures(sp => 
       { 
        sp.Insert(i => i.HasName("web_DS_Set_DocHeaders") 
            .Parameter(p => p.OutletID, "mfID") 
            .Parameter(p => p.DocTypeID, "orType") 
            .Parameter(p => p.Comment, "orComment") 
            .Parameter(p => p.Sum, "orSum") 

            .Result(r => r.Number, "orNumber") 
            .Result(r => r.OrderDate,"orDate") 
            .Result(r => r.ID, "orID")); 
       }); 

そして、私の保存されたporcedureのi'amの終わりには復帰に挿入された行

Select orNumber, orDate, orId from Orders where --parameters for last inserted|updated row 
関連する問題