[英]EF Core 2.0 Updating one-to-zero-or-one child entity causes error
我有兩個實體
[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
}
當我嘗試更新現有ProgramTemplate記錄上對UploadedMedia的引用時,它引發以下錯誤
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);
}
}
插入時工作正常,但分配新的uploadMedia對象時無法更新。 有誰知道為什么會這樣? 我不想從數據庫中刪除任何一個對象。 我的配置有問題嗎? 謝謝您的寶貴時間!
這是mapster錯誤地映射實體的問題。 當源是實體的視圖模型時,我修改了配置以忽略該屬性,並且工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.