[英]Entity Framework Core not filling object by foreign key on update
我在更新Application
时看到此错误。 object 有两个外部连接: ApplicationVisitors
和ApplicationPlatforms
。 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 ApplicationPlatforms
和ApplicationVisitors
中的Platform
和Visitor
没有通过外键填写。 引用存在于类中。 查看结果 附加
应用
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.