首页 > 解决方案 > 一对可选的关系不更新 EF Core 上的主体实体

问题描述

我遇到这种情况。我有相关实体:Case and a Confinement

Case 有一个可选的导航到 confinement - ConfinementId,而 confinement 有一个必需的 CaseId。

我的问题是当我尝试通过附加限制记录来更新案例时,案例实体上的 confinementID 没有更新。

这是我的映射和实体类:

public class Confinement : Entity
{
    public int Id { get; set; }
    public string ReferenceId { get; set; }
    public int CaseId { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public bool IsActive { get; set; }
    public int BranchId { get; set; }
    public string Status { get; set; }
    public virtual Case Case {get;set;}
 }

public class Case : Entity
{
    public int CaseId { get; set; }
    public string CaseReferenceId { get; set; }
    public int? ConsultationId { get; set; }
    public int? ConfinementId { get; set; }
    public virtual Confinement Confinement { get; set; }
    ****Omitted
 }

配置

    public void Configure(EntityTypeBuilder<Case> builder)
    {
        builder.HasKey(c => c.CaseId);
        builder.HasMany(t => t.Details)
            .WithOne(t => t.Case)
            .HasForeignKey(t => t.CaseId);

        builder.HasOne(t => t.Confinement)
            .WithOne(a=>a.Case)
            .HasForeignKey<Confinement>(t => t.CaseId);
    }

    public void Configure(EntityTypeBuilder<Confinement> builder)
    {
        builder.HasKey(c => c.Id);

        builder.HasOne(a => a.Case)
            .WithOne(a => a.Confinement)
            .HasForeignKey<Confinement>(a => a.CaseId);
    }

控制器代码

public async Task<IActionResult> AddConfinement(int caseId)
{
    if (caseId == 0)
        return BadRequest();
    if (_service.ExistingCase(caseId))
        return BadRequest("Case has already a confinement record!");
    var @case = await _caseService.FindAsync(caseId);
    if (@case == null)
        return NotFound("Case not found!");
    var confinement = _converter.ConvertFromCase(@case);
    confinement.ObjectState = ObjectState.Added;
    @case.Confinement = confinement;
    @case.ObjectState = ObjectState.Modified;
    @case.ConfinementId = confinement.Id;
    _caseService.Update(@case);
    await _unitOfWork.SaveChangesAsync();
    return Ok();
}

调用 AddConfinement 方法时,会在数据库上添加限制,但不会更新 Case.ConfinementId。这个实现有什么问题吗。作为一种解决方法,我在数据库上创建了一个触发器,但我想在应用程序级别完成此操作。

标签: entity-framework.net-coreentity-framework-coreef-core-2.2

解决方案


推荐阅读