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);
}
}