【问题标题】:EF Core 2.0 Updating one-to-zero-or-one child entity causes errorEF Core 2.0 更新一对零或一子实体会导致错误
【发布时间】:2019-01-26 02:25:40
【问题描述】:

我有两个实体,

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

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

【问题讨论】:

  • 可能是其他部分发生错误。不是吗?
  • 其实你是对的。经过进一步调查,这似乎是与 mapster 的初始映射的问题。等我弄明白了再评论。

标签: c# entity-framework-core ef-core-2.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-04-25
    • 2021-06-25
    • 2018-07-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多