我正在将.NET4.6上的ASP.NETWeb API更新到.NET7,我对EF Core有一些问题.我正在使用HTTP POST创建一个新事件,并收到以下错误:

Status: 400
One or more validation errors occurred The Trs field is required
The Reason field is required
The LineStatus field is required

这些都是Event上的虚拟财产:

public partial class Event
{
    public int IssueId { get; set; }
    public int? IssueNum { get; set; }
    public int? IssueNumH { get; set; }
    public int IssueVersion { get; set; }
    public bool Replaced { get; set; }

    public int TrsId { get; set; }
    public int ReasonId { get; set; }
    public string? Comments { get; set; }
    public int LineStatusId { get; set; }

    public DateTime TimeStart { get; set; }
    public DateTime? TimeEnd { get; set; }

    public int EventEditorId { get; set; }
    public int? Ticketuid { get; set; }

    public DateTime? TimeEndValue { get; set; }

    public int Archived { get; set; }
    public int? OriginalEvent { get; set; }

    public DateTime? CreatedDate { get; set; }

    public int? RelatedEvent { get; set; }

    public virtual LineStatus LineStatus { get; set; } = null!;
    public virtual ReasonTree Reason { get; set; } = null!;
    public virtual WorkOrder? Ticketu { get; set; }
    public virtual TrsId Trs { get; set; } = null!;
}

我try 在这些属性上使用[JsonIgnore]属性,但似乎没有任何作用.

我还将它们注释掉,因为我还不需要关系对象.这就是控制器方法,我可以看到该事件具有它需要在数据库表中匹配的所有属性,但是当它调用SaveChanges时,我得到这个错误:

SqlException: Invalid column name 'ReasonTreeId'.
Invalid column name 'TrsId1'.
Invalid column name 'WorkOrderTicketuid'.

我对EF Core不是很熟悉,有没有什么方法可以在模型构建器中设置我的模型,告诉它在模型绑定时忽略属性?我还做错了什么吗

以下是我的控制器和模型构建器上的端点:

    // POST: api/Events        
    [HttpPost]
    public async Task<ActionResult<Event>> PostEvent(Event @event)
    {
        if (_context.Events == null)
        {
            return Problem("Entity set 'TrsContext.Events'  is null.");
        }
        _context.Events.Add(@event);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetEvent", new { id = @event.IssueId }, @event);
    }
modelBuilder.Entity<Event>(entity =>
{
    entity.HasKey(e => e.IssueId);

    entity.HasIndex(e => e.IssueNum, "IX_Events_IssueNum");

    entity.HasIndex(e => new { e.Replaced, e.TrsId, e.TimeStart, e.TimeEnd }, "IX_Events_Replaced_TrsID_Start_End");

    entity.Property(e => e.IssueId).HasColumnName("IssueID");
    entity.Property(e => e.Archived).HasComputedColumnSql("(case when [TimeEnd]<dateadd(year,(-1),getdate()) then (1) else (0) end)", false);
    entity.Property(e => e.CreatedDate)
        .HasDefaultValueSql("(getdate())")
        .HasColumnType("datetime");
    entity.Property(e => e.EventEditorId).HasColumnName("EventEditorID");
    entity.Property(e => e.IssueNum).HasComputedColumnSql("(coalesce([IssueNum_h],[IssueID]))", false);
    entity.Property(e => e.IssueNumH).HasColumnName("IssueNum_h");
    entity.Property(e => e.LineStatusId)
        .HasDefaultValueSql("((1))")
        .HasColumnName("LineStatusID");
    entity.Property(e => e.ReasonId).HasColumnName("ReasonID");
    entity.Property(e => e.Ticketuid).HasColumnName("ticketuid");
    entity.Property(e => e.TimeEnd).HasColumnType("datetime");
    entity.Property(e => e.TimeEndValue)
        .HasComputedColumnSql("(coalesce([TimeEnd],getdate()))", false)
        .HasColumnType("datetime");
    entity.Property(e => e.TimeStart).HasColumnType("datetime");
    entity.Property(e => e.TrsId).HasColumnName("TrsID");

    entity.HasOne(d => d.LineStatus).WithMany(p => p.Events)
        .HasForeignKey(d => d.LineStatusId)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Events_LineStatus");

    entity.HasOne(d => d.Reason).WithMany(p => p.Events)
        .HasForeignKey(d => d.ReasonId)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Events_ReasonTrees");

    entity.HasOne(d => d.Ticketu).WithMany(p => p.Events)
        .HasForeignKey(d => d.Ticketuid)
        .HasConstraintName("FK_Events_WorkOrders");

    entity.HasOne(d => d.Trs).WithMany(p => p.Events)
        .HasForeignKey(d => d.TrsId)
        .OnDelete(DeleteBehavior.ClientSetNull)
        .HasConstraintName("FK_Events_TrsIDs");
});

推荐答案

绑定不是EF核心的一部分,而是ASP.NET核心的一部分.可以说,最简单的 Select 是只为场景创建一个简单的DTO/Model类,并删除其中的额外字段,然后将其映射到实体(可选地使用某个映射库,如AutoMapper):

public partial class CreateEventModel
{
    public int IssueId { get; set; }

    public int? IssueNum { get; set; }

    // List only needed fields here

    public int? OriginalEvent { get; set; }

    public int? RelatedEvent { get; set; }
}

或者,您可以将共享字段移动到某个基类.

备注:

Csharp相关问答推荐

如何从顶部提取发票号作为单词发票后的第一个匹配

CsWin32如何创建PWSTR的实例,例如GetWindowText

属性getter和setter之间的空性不匹配?

选取器与.NET Maui MVVM的绑定属性

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

实体框架核心中的ComplexType和OwnsOne有什么不同?

UWP中的任务和界面

如何在实体框架中添加包含列表?

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

EF核心新验证属性`DeniedValues`和`StringCompison`不起作用

C#自定义验证属性未触发IsValid方法

Google OAuth令牌交换在.Net中不起作用

如何在.NET MAUI中最大化GraphicsView的大小?

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

KeyDown从我的文本框中删除输入,如何停止?

C#;AvaloniaUI;MVVM;当另一个窗口上的按钮被单击时,如何更新视图图像源?

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

Excel将';@';添加到具有范围的公式中

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?