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。”
对于这样简单的任务,我认为我的方法过于复杂。也许有更好的办法
以下是数据库示意图,以防万一: