c# - 在实体框架中更新子实体不起作用
问题描述
您好,我有一个名为 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; }
}
当我尝试更新属性以及子实体时,我看到为子实体创建的新记录而不是现有的更新。例如,我在要更新的属性中发送 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 的新记录。
我的理解是,如果子实体已经存在,它应该更新它们。相反,它似乎正在添加新记录。
谁能告诉我发生了什么以及如何解决这个问题。
解决方案
您正在创建 ImageSortOrder 的新实例,并且 Id 值由数据库自动分配。如果要更新现有对象,则应从 DbContext 获取它并更新其属性。
或者,您可以在 DbSet 上使用 Attach 方法,而不是在子集合上使用 Add。它会像你期望的那样工作。
var entity = new ImageSortOrder{ ImageSortOrderId = 862};
db.ImageSortOrders.Attach(entity);
// Now you can update the properties...
// ...and save changes
db.SaveChanges();
推荐阅读
- go - Golang同时发送和接收udp数据包
- javascript - 使用 api 返回的 Html 进行重定向
- ruby-on-rails - 大规模更新时的 ActiveModel::Errors
- php - 使用 PHP 和 AJAX 的链表
- sql - 如何在 SQL 查询中将多条记录分组为一条
- barcode-scanner - 如何在 mc67 上对 datawedge 进行编程以在扫描条码后前进到下一个屏幕
- oozie-coordinator - Oozie 工作不在工作列表中
- ios - Ionic 3:警告:清理不安全的 URL 值
- internet-explorer - 如果我没有安装 MS Edge 网络浏览器,如何在其上测试我的网站?
- javascript - JavaScript 如何知道等待内部承诺的结果?