C# 更新父实体时如何更新相关的一对一实体

C# 更新父实体时如何更新相关的一对一实体,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有两门课: [Table("DropPhotos")] public class DbDropPhoto { [Key] public Guid PhotoId { get; set; } public byte[] Content { get; set; } public virtual DbContour Contour { get; set; } } public class DbContour { [Key] public Guid

我有两门课:

[Table("DropPhotos")]
public class DbDropPhoto
{
    [Key] public Guid PhotoId { get; set; }
    public byte[] Content { get; set; }
    public virtual DbContour Contour { get; set; }
}

public class DbContour
{
    [Key] public Guid ContourId { get; set; }

    public string CalculationParameters { get; set; }
    public string CalculationProvider { get; set; }
    public string ConnectedLines { get; set; }

    public virtual DbDropPhoto CurrentDropPhoto { get; set; }
}
它们之间的关系通过Fluent API描述如下:

    modelBuilder.Entity<DbContour>()
        .HasRequired(s => s.CurrentDropPhoto)
        .WithOptional(s => s.Contour)
        .WillCascadeOnDelete();
modelBuilder.Entity()
.HasRequired(s=>s.CurrentDropPhoto)
.带可选(s=>s.Contour)
.WillCascadeOnDelete();
我需要更新DbDropPhoto和它的DbContour。更新轮廓有几种情况:

  • 轮廓已更新
  • 轮廓被删除
  • 添加了等高线
  • 为此,我编写了以下方法:

    public async Task UpdateDropPhoto(DbDropPhoto dropPhoto)
    {
        using (var context = new DDropContext())
        {
            try
            {
                var contour = await context.Contours
                    .FirstOrDefaultAsync(x => x.ContourId == dropPhoto.PhotoId);
    
                if (contour != null && dropPhoto.Contour != null)
                {
                     contour.CalculationParameters = dropPhoto.Contour.CalculationParameters;
                    contour.CalculationProvider = dropPhoto.Contour.CalculationProvider;
                    contour.ConnectedLines = dropPhoto.Contour.ConnectedLines;
    
                    context.Set<DbContour>().AddOrUpdate(contour);
    
                    
                }
                else if (dropPhoto.Contour != null)
                {
                    context.Set<DbContour>().AddOrUpdate(dropPhoto.Contour);
                }
                else if (contour != null && dropPhoto.Contour == null)
                {
                    context.Contours.Remove(contour);
                }
    
                context.DropPhotos.Attach(dropPhoto);
    
                context.Entry(dropPhoto).State = EntityState.Modified;
                
                context.Entry(dropPhoto).Property(x => x.Content).IsModified = false;
    
                await context.SaveChangesAsync();
            }
            catch (SqlException e)
            {
                throw new TimeoutException(e.Message, e);
            }
        }
    }
    
    public异步任务updatedrophoto(DbDropPhoto-dropPhoto)
    {
    使用(var context=new DDropContext())
    {
    尝试
    {
    var contour=await context.Contours
    .FirstOrDefaultAsync(x=>x.ContourId==dropPhoto.PhotoId);
    if(等高线!=null&&dropPhoto.contour!=null)
    {
    contour.CalculationParameters=dropPhoto.contour.CalculationParameters;
    contour.CalculationProvider=dropPhoto.contour.CalculationProvider;
    contour.ConnectedLines=dropPhoto.contour.ConnectedLines;
    context.Set().AddOrUpdate(轮廓);
    }
    else if(dropPhoto.Contour!=null)
    {
    context.Set().AddOrUpdate(dropPhoto.Contour);
    }
    else if(轮廓!=null&&dropPhoto.contour==null)
    {
    上下文。等高线。删除(等高线);
    }
    context.DropPhotos.Attach(dropPhoto);
    context.Entry(dropPhoto.State=EntityState.Modified;
    context.Entry(dropPhoto.Property(x=>x.Content).IsModified=false;
    wait context.saveChangesSync();
    }
    捕获(SQLE异常)
    {
    抛出新的TimeoutException(e.Message,e);
    }
    }
    }
    
    无论我如何尝试,我最终都会遇到例外:

    System.InvalidOperationException:'违反了多重性约束。 关系的角色“DbContour\u CurrentDropPhoto\u Source” “DDrop.Db.DbContour_CurrentDropPhoto”的多重数为1或0..1。”

    对于这样简单的任务,我认为我的方法过于复杂。也许有更好的办法

    以下是数据库示意图,以防万一: