EF Core 2.0 更新一到零或一个子实体会导致错误



我有两个实体,

[Table("tblProgramTemplate", Schema = "ProgramTemplate")]
public class ProgramTemplate
{
#region Properties
[Key]
public int pkProgramTemplate { get; set; }
public string fkUser { get; set; }
public int? fkUploadedMedia { get; set; }
public DateTime? DateCreated { get; set; }
public DateTime? DatePublished { get; set; }
public bool Deleted { get; set; }
public DateTime? DateDeleted { get; set; }
public int Likes { get; set; }
public int Shares { get; set; }
public int Downloads { get; set; }
public string Name { get; set; }
public string Description { get; set; }
[Column(TypeName = "decimal(18,2)")]
public decimal Price { get; set; }
public int Position { get; set; }
#endregion
#region Navigation     
[ForeignKey("fkUser")]
public virtual ApplicationUser User { get; set; }
[ForeignKey("fkUploadedMedia")]
public virtual UploadedMedia UploadedMedia { get; set; }
public virtual IEnumerable<Instance.Program> Programs { get; set; }
public virtual IEnumerable<ProgramParameterTemplate> ProgramParameterTemplates { get; set; }
public virtual IEnumerable<ApplicationUser> Subscribers { get; set; }
#endregion

。和。。。

[Table("tblUploadedMedia", Schema = "Common")]
public class UploadedMedia
{
#region Properties
[Key]
public int pkUploadedMedia { get; set; }
public string fkUser { get; set; }
public string FilePath { get; set; } 
public string OriginalFileName { get; set; }
public DateTime? DateCreated { get; set; }
public bool Deleted { get; set; }
public DateTime? DateDeleted { get; set; }
#endregion
#region Navigation
[ForeignKey("fkUser")]
public virtual ApplicationUser User { get; set; }
#endregion
}

当我尝试更新对现有程序模板记录上上传媒体的引用时,它会引发以下错误

System.InvalidOperationException:"实体类型"UploadedMedia"上的属性'pkUploadedMedia'是键的一部分,因此不能修改或标记为已修改。要使用标识外键更改现有实体的主体,请先删除依赖实体并调用"保存更改",然后将依赖实体与新主体关联。

控制器代码如下所示 -

[HttpPost("")]
public void Upsert([FromBody]ProgramTemplateViewModel vm)
{
var userID = _userManager.GetUserAsync(HttpContext.User)?.Result?.Id;
UploadedMedia programTemplateMedia = null;
//convert the base64 string to byte array
if (!string.IsNullOrEmpty(vm.UploadedMedia.FileData) && vm.UploadedMedia.pkUploadedMedia == null)
{
var imageBytes = Convert.FromBase64String(vm.UploadedMedia.FileData);
var filePath = string.Format("{0}/{1}{2}", "./ClientApp/src/assets", Guid.NewGuid(), vm.UploadedMedia.OriginalFileName);
using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
{
fs.Write(imageBytes);
fs.Flush();
}
programTemplateMedia = new UploadedMedia()
{
FilePath = filePath,
OriginalFileName = vm.UploadedMedia.OriginalFileName,
DateCreated = DateTime.Now,
fkUser = userID
};
} 
//if ID is null, insert, else update
if (vm.pkProgramTemplate == null)
{
var template = vm.Adapt<ProgramTemplate>();
template.fkUser = userID;
if(programTemplateMedia != null)
{
template.UploadedMedia = programTemplateMedia;
}
_templateService.AddEntity(template);
}
else
{
var template = _templateService.GetEntityById(vm.pkProgramTemplate.Value);
template = vm.Adapt(template);                
if (programTemplateMedia != null)
{                    
template.UploadedMedia = programTemplateMedia;
}
_templateService.UpdateEntity(template);
}
}

它在插入时工作正常,但在分配新的上传媒体对象时无法更新。有谁知道为什么会这样?我不想从数据库中删除任何一个对象。我的配置有问题吗?谢谢你的时间!

这是映射器错误地映射实体的问题。我修改了我的配置,当源是实体的视图模型时,我忽略该属性,并且它工作正常。

最新更新