实体框架关系和AutoDetectChanges=错误问题

本文关键字:错误 问题 AutoDetectChanges 框架 关系 实体 | 更新日期: 2023-09-27 17:58:18

我的目标是实现大规模的插入/更新操作。域模型由图像实体组成,该实体与文件夹多对一实体相关。

通常情况下,我会通过以下方式将图像添加到数据库上下文中:

var folder = dbContext.Folders.First();
var image = new Image();
image.Folder = folder;
image.<SomeFields> = "<SomeData>";
dbContext.Images.Add(image);
dbContext.SaveChanges();

为了获得更好的性能,我关闭了自动更改跟踪:

dbContext.Configuration.AutoDetectChangesEnabled = false;

现在我得到一个错误:

"DbContext.Images"中的实体参与"Image_Folder"关系找到0个相关的"Image_Folder_Target"。1.应为"Image_Folder_Target"。

我尝试使用:

folder.Images.Add(image);
dbContext.Entry(folder).State = EntityState.Modified;

但这无济于事。

我应该如何修复错误?

UPD:固定代码段

UPD2:简化的实体(删除了基类的继承(使代码更可读)和大多数不必要的属性):

图像.cs

public class Image
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string AuthorName { get; set; }
    public string AuthorUrl { get; set; }
    [StringLength(255)]
    [Required]
    [Column(TypeName = "VARCHAR")]
    public new string File { get; set; }
    [Required]
    public bool IsCover { get; set; }
    [Required]
    public int Order { get; set; }
    public virtual Product Product { get; set; }
    [Required]
    public virtual Folder Folder { get; set; }
    public override string ToString()
    {
        return File;
    }
    public Image()
    {
        Order = 1;
    }
}

文件夹.cs

public class Folder
{
    public int Id { get; set; }
    public virtual Folder Parent { get; set; }
    public virtual ICollection<Image> Images { get; set; }
    public virtual ICollection<Folder> Folders { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
    public Folder()
    {
        Images = new HashSet<Image>();
    }
}

实体框架关系和AutoDetectChanges=错误问题

我测试了您的代码,没有出现异常,但没有数据插入数据库。试试这个,替换***代码

dbContext.Configuration.AutoDetectChangesEnabled = false;
var folder = dbContext.Folders.First();
var image = new Image();
image.Folder = folder;
image.<SomeFields> = "<SomeData>";
**dbContext.Entry(image).State = EntityState.Added; **
dbContext.SaveChanges();