2

我正在使用 EF6 alpha 并使用新功能映射到存储过程。在我的单元测试中,我收到错误“过程或函数 CreateDayDetail 指定了太多参数”。

SQL Profiler 显示以下 proc 调用:

exec [Schedule].[CreateDayDetail] @startTime=0,@duration=1,@durationEst=0,@isPaid=1,@requirePunch=0,@dayKey=16,@activityTypeKey=1,@TemplateDay_Key=NULL

问题是自动生成的@TemplateDay_Key 参数。但是,我不确定为什么在没有为 ActivityType 创建一个时创建它。

这是实体类:

public class DayDetail
{
    [Key]
    public int Key { get; set; }

    [Required]
    public TemplateDay Day { get; set; }

    [Required]
    public ActivityType Activity { get; set; }

    [Range(TimeMinimum, TimeMaximum)]
    public int StartTime { get; set; }

    [Range(DurationMinimum, DurationMaximum)]
    public int Duration { get; set; }

    public bool DurationEstimated { get; set; }

    public bool IsPaid { get; set; }

    public bool RequirePunch { get; set; }

    [Timestamp]
    public byte[] Version { get; set; }
}

这是我用来配置模型的 fluent API:

typeConfig.ToTable("Schedule.DayDetail");
typeConfig.Property(d => d.Key)
    .HasColumnName("DayDetailKey");
typeConfig.HasRequired(d => d.Day)
    .WithMany()
    .Map(d => d.MapKey("TemplateDayKey"));
typeConfig.HasRequired(d => d.Activity)
    .WithMany()
    .Map(d => d.MapKey("ActivityTypeKey"));

typeConfig.MapToStoredProcedures(sp =>
    sp.Insert(i => i.HasName("Schedule.CreateDayDetail")
        .Parameter(d => d.Day.Key, "dayKey")
        .Parameter(d => d.Activity.Key, "activityTypeKey")
        .Parameter(d => d.StartTime, "startTime")
        .Parameter(d => d.Duration, "duration")
        .Parameter(d => d.DurationEstimated, "durationEst")
        .Parameter(d => d.IsPaid, "isPaid")
        .Parameter(d => d.RequirePunch, "requirePunch"))
    .Update(u => u.HasName("Schedule.UpdateDayDetail")
        .Parameter(d => d.Key, "key")
        .Parameter(d => d.Day.Key, "dayKey")
        .Parameter(d => d.Activity.Key, "activityTypeKey")
        .Parameter(d => d.StartTime, "startTime")
        .Parameter(d => d.Duration, "duration")
        .Parameter(d => d.DurationEstimated, "durationEst")
        .Parameter(d => d.IsPaid, "isPaid")
        .Parameter(d => d.RequirePunch, "requirePunch")
        .Parameter(d => d.Version, "version"))
    .Delete(x => x.HasName("Schedule.DeleteDayDetail")
        .Parameter(d => d.Key, "key")
        .Parameter(d => d.Day.Key, "dayKey")
        .Parameter(d => d.Activity.Key, "activityTypeKey")
        .Parameter(d => d.Version, "version")));

我今天看了这个太久了。我很感激任何帮助.......

4

2 回答 2

0

三个月大的问题...

它在那里是因为您在模型中使用没有外键的关系。您正在模型中而不是在数据库中创建关系。

您没有使用:.HasForeignKey(d => d.TemplateDayKey_ID);

您正在使用.Map(d => d.MapKey("TemplateDayKey"));,这需要传递此关系信息以插入和更新存储过程作为处理此关系的参数。

如果您在模型中使用基于 ForeignKey 的关系,您将在存储过程参数列表中看到参数 TemplateDayKey_id。

于 2013-09-10T12:32:43.137 回答
0

在我的例子中,我有一个在我的模型的数据库中生成的属性,并且 EF 试图将此属性作为参数插入,因为我没有正确标记该属性。我需要改变

public string SomeProperty { get; set; }

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

. . . 然后 EF 停止尝试将该值作为 proc 的一部分插入。

于 2021-03-19T20:15:57.440 回答