簡體   English   中英

EF Core 2.0更新一對零或一個子實體會導致錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM