私は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だけを渡すことはできますか?
のために、このようなものを持っていますMapToStoredProcedures(s => s.Insert(i => i.HasName( "InsertFile"))。パラメータ(f => f.Name、 "Name")));パラメータを「Name」に名前を付ける必要はありません。名前はすでに名前であるため、パラメータを削除します。 EFがすべてのパラメータを通過していることをどのように知っていますか? SQLの出力はありますか? –
とても素敵な質問ですが、私はこれを次のように説明します。興味のあるものは何ですか...選択したものは何をしていますか?あなたがSQLでデバッグしていたときにそれが何であるかを見ることができません。 – Seabizkit
いいえ、EFがすべてのパラメータを渡していることはわかりません。私は例外メッセージの内容を完全に理解しています。私はコンテキストオブジェクトのSaveChangeds()メソッドにデバッグすることができないので、どこに問題があるのか正確にはわからない。プログラムはcontext.SaveChanges()でDbUpdateExceptionで破損しています –