在实体框架中更新子实体不起作用

时间:2019-01-17 20:53:46

标签: c# entity-framework

你好,我有一个叫做Property的类:

它具有以下子实体:-

Public class Property
{

  public virtual ICollection<PropertyUrl> Property_URLs { get; set; }
  public virtual ICollection<BrochureData> Property_Brochures { get; set; }
  public virtual ICollection<ImageSortOrder> Property_ImageSortOrders { get; set; }

}

当我尝试更新Property及其子实体时,我看到为子实体创建的新记录,而不是现有记录的更新。例如,我在属性中发送ImageSortOrder进行更新:-

           //Property Image
            ImageSortOrder imageSortOrder = new ImageSortOrder();
            imageSortOrder.FileName = "Sai Test Image.jpg";
            imageSortOrder.SortOrder = 2; ;
            imageSortOrder.Image_Cloudinary_PublicId = "Test_1234";
            imageSortOrder.Image_Cloudinary_Url = "www.jll.com";
            imageSortOrder.MimeType = "jpg";
            imageSortOrder.IsActive = true;
            imageSortOrder.ModifiedOn = DateTime.Now;
            imageSortOrder.SortOrder = 1;
            imageSortOrder.ImageSortOrderId = 862;

            p.Property_ImageSortOrders.Add(imageSortOrder);

如您所见,我正在尝试使用ID 862更新子实体。相反,它使用ID-863创建了一条新记录。

我的理解是,如果子实体已经存在,它将更新子实体。相反,它似乎正在添加新记录。

任何人都可以告诉我怎么回事以及如何解决该问题。

2 个答案:

答案 0 :(得分:2)

您正在创建ImageSortOrder的新实例,并且Id值由数据库自动分配。如果要更新现有对象,则应从DbContext中获取它并更新其属性。

或者,您可以在DbSet上使用Attach方法,而不是在子集合上添加。它会像您期望的那样工作。

if (c is TextBox textBox)
{
    Clipboard.SetDataObject(textBox.Text);
}

答案 1 :(得分:0)

是的,这就是为什么我讨厌英孚。 但是您的代码应该是这样的。

如果您想要一个更好的库来满足您的要求,请尝试我的库EntityWorker.Core

//属性图片

    ImageSortOrder imageSortOrder = dbcontext.Property_ImageSortOrders.Where(c=> c.ImageSortOrderId == 862).First();
    imageSortOrder.FileName = "Sai Test Image.jpg";
    imageSortOrder.SortOrder = 2; ;
    imageSortOrder.Image_Cloudinary_PublicId = "Test_1234";
    imageSortOrder.Image_Cloudinary_Url = "www.jll.com";
    imageSortOrder.MimeType = "jpg";
    imageSortOrder.IsActive = true;
    imageSortOrder.ModifiedOn = DateTime.Now;
    imageSortOrder.SortOrder = 1;