繁体   English   中英

实体框架核心在更新时未通过外键填充 object

[英]Entity Framework Core not filling object by foreign key on update

我在更新Application时看到此错误。 object 有两个外部连接: ApplicationVisitorsApplicationPlatforms Application中的属性已更新,但外部连接未更新。 我究竟做错了什么? 如何正确更新Application

路线

[Route("update")]
[HttpPut]
public async Task<IActionResult> UpdateApplication(ApplicationDTO applicationDTO)
{
     if (!ModelState.IsValid)
         return BadRequest("Модель не валидна!");

     await applicationService.UpdateApplication(applicationDTO);
     return Ok();
}

服务

public async Task UpdateApplication(ApplicationDTO applicationDTO)
{
      var visitors = Mapper.ToVisitors(applicationDTO.ApplicationVisitors);
      var visitorsToCreate = visitors.Where(w => w.Id == 0).ToList();
      var createdVisitors = visitors.Where(w => w.Id > 0).ToList();

      var resultCreateVisitors = await _wrapper.Visitor.CreateVisitorsAsync(visitorsToCreate);
            createdVisitors.AddRange(resultCreateVisitors);

      applicationDTO.ApplicationVisitors = Mapper.ToVisitors(createdVisitors);

      await _wrapper.Application.UpdateAsync(Mapper.ToApplication(applicationDTO));
}

存储库方法

public async Task UpdateAsync(Application application)
{
      Update(application);
      await SaveAsync();
}

基础存储库

public void Update(T entity)
{
      _repositoryContext.Set<T>().Attach(entity);
      _repositoryContext.Entry(entity).State = EntityState.Modified;
}

public async Task SaveAsync()
{
      await _repositoryContext.SaveChangesAsync();
}

我在调试中没有任何异常。 Application是通过ID填写的,但是collections ApplicationPlatformsApplicationVisitors中的PlatformVisitor没有通过外键填写。 引用存在于类中。 查看结果 附加

应用

public class Application
{
    public int Id { get; set; }
    [Column(TypeName="date")]
    public DateTime DateStart { get; set; }
    [Column(TypeName = "date")]
    public DateTime DateEnd { get; set; }
    public int ApproverId { get; set; }
    public User Approver { get; set; }
    public int StatusId { get; set; }
    public ApplicationStatus Status { get; set; }
    public string VisitPurpose { get; set; }
    public DateTime CreatedAt { get; set; }
    public int AuthorId { get;set; }
    public User Author { get; set; }
    public IList<Draft> Drafts { get; set; }
    public IList<ApplicationVisitor> ApplicationVisitors { get; set; }
    public IList<ApplicationPlatform> ApplicationPlatforms { get; set; }
    public IList<Pass> Passes { get; set; }
}

应用访问者

public class ApplicationVisitor
{
    public int ApplicationId { get; set; }
    [ForeignKey("ApplicationId")]
    public Application Application { get; set; }
    public int VisitorId { get; set; }
    [ForeignKey("VisitorId")]
    public Visitor Visitor { get; set; }
}

应用平台

public class ApplicationPlatform
{
    public int ApplicationId { get; set; }
    [ForeignKey("ApplicationId")]
    public Application Application { get; set; }
    public int PlatformId { get; set; }
    [ForeignKey("PlatformId")]     
    public Platform Platform { get; set; }
}

更新日期:2019 年 10 月 22 日。 这是我的解决方案,在基本选择的答案上对我有用!

我在ApplicationRepository中重写了更新方法

public async Task UpdateAsync(Application application)
{
    var app = await GetAsync(application.Id);

    app.DateStart = application.DateStart;
    app.DateEnd = application.DateEnd;
    app.ApproverId = application.ApproverId;
    app.StatusId = application.StatusId;
    app.VisitPurpose = application.VisitPurpose;
    app.CreatedAt = application.CreatedAt;
    app.AuthorId = application.AuthorId;
    app.ApplicationVisitors = application.ApplicationVisitors;
    app.ApplicationPlatforms = application.ApplicationPlatforms;

    Update(app);
    await SaveAsync();
}

并在我的BaseRepository中重写了方法

public void Update(T entity)
{
    _repositoryContext.Set<T>().Update(entity);
}

尽管您附加了应用程序 object 并将其 state 设置为已修改,但它引用的所有其他对象都将在未更改的state中,如下所述:

对于具有生成键的实体类型,如果实体设置了其主键值,那么它将在未更改的 state 中进行跟踪。 如果未设置主键值,则会在添加的 state 中进行跟踪。 这有助于确保只插入新实体。 如果主键属性设置为属性类型的 CLR 默认值以外的任何值,则认为实体已设置其主键值。

您可以手动设置所有引用对象的 state,或者,我选择的更好方法是从数据库加载对象(并让 EF 跟踪它们的更改)并修改这些对象。 这样,EF 将知道每个 object 的确切 state 以将其保存到数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM