C# EF Core 2.0将一个实体更新为零或一个子实体会导致错误

C# EF Core 2.0将一个实体更新为零或一个子实体会导致错误,c#,entity-framework-core,ef-core-2.0,C#,Entity Framework Core,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 { g

我有两个实体

[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
当我试图更新对现有ProgramTemplate记录上UploadeMedia的引用时,它抛出以下错误

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

控制器代码如下所示-

[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);
        }
    }
[HttpPost(“”)
public void Upsert([FromBody]ProgramTemplateViewModel vm)
{
var userID=\u userManager.GetUserAsync(HttpContext.User)?.Result?.Id;
UploadedMedia programTemplateMedia=null;
//将base64字符串转换为字节数组
如果(!string.IsNullOrEmpty(vm.uploademdedia.FileData)&&vm.uploademdedia.pkuploademdedia==null)
{
var imageBytes=Convert.FromBase64String(vm.UploadedMedia.FileData);
var filePath=string.Format(“{0}/{1}{2}”、“/ClientApp/src/assets”、Guid.NewGuid()、vm.uploademdedia.OriginalFileName);
使用(FileStream fs=newfilestream(filePath,FileMode.OpenOrCreate))
{
fs.写入(imageBytes);
fs.Flush();
}
programTemplateMedia=新上载的媒体()
{
FilePath=FilePath,
OriginalFileName=vm.uploademdedia.OriginalFileName,
DateCreated=DateTime。现在,
fkUser=userID
};
} 
//如果ID为空,则插入,否则更新
if(vm.pkProgramTemplate==null)
{
var template=vm.Adapt();
template.fkUser=userID;
if(programTemplateMedia!=null)
{
template.uploademdedia=programTemplateMedia;
}
_templateService.AddEntity(模板);
}
其他的
{
var template=\u templateService.GetEntityById(vm.pkProgramTemplate.Value);
template=vm.Adapt(模板);
if(programTemplateMedia!=null)
{                    
template.uploademdedia=programTemplateMedia;
}
_templateService.UpdateEntity(模板);
}
}

它在插入时工作正常,但在分配新的UploadeMedia对象时无法更新。有人知道为什么会发生这种情况吗?我不想从数据库中删除任何一个对象。我的配置有问题吗?谢谢你抽出时间

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

可能是错误进入其他部分。不是吗?事实上,你是对的。经过进一步调查,这似乎是mapster初始映射的问题。等我弄明白了再评论。
[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);
        }
    }