实体框架关系和AutoDetectChanges = false问题

时间:2016-07-23 23:52:04

标签: c# entity-framework

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

通常我会以这种方式将数据添加到数据库上下文中:

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&#39;中的实体参与&#39; Image_Folder&#39;   关系。 0相关&#39; Image_Folder_Target&#39;被找到。 1   &#39; Image_Folder_Target&#39;是预期的。

我试图使用:

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

但它没有帮助。

我该如何修复错误?

UPD:固定代码段

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

Image.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;
    }
}

Folder.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>();
    }
}

1 个答案:

答案 0 :(得分:1)

我测试你的代码,没有异常发生,但没有数据插入数据库。试试这个,替换****代码

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();
相关问题