簡體   English   中英

如何在 EF Core 中從 JSON 更新實體

[英]How to update entities from JSON in EF Core

我正在將數據從 EF 核心序列化為 JSON 文件。 我的型號和配置:

public class Customer
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

public class Order
{
    [Key]
    public Guid Id { get; set; }
    public Guid CustomerGuid { get; set; }

    [JsonIgnore]
    public virtual Customer Customer { get; set; }

    public string OrderType { get; set; }
}

    public class CustomerConfiguration : IEntityTypeConfiguration<Customer>
    {
        public void Configure(EntityTypeBuilder<Customer> builder)
        {
            builder.HasMany(p => p.Orders).WithOne(d => d.Customer).HasForeignKey(d => d.CustomerGuid);
        }
    }
    public class OrderConfiguration : IEntityTypeConfiguration<Order>
    {
        public virtual void Configure(EntityTypeBuilder<Order> builder)
        {
            builder.HasOne(p => p.Customer).WithMany(p => p.Orders).HasForeignKey(d => d.CustomerGuid);
        }
    }

我將一位客戶序列化為 JSON 文件:

  {
  "Id": "18a55fea-89cd-438a-bae0-4954193807bf",
  "Name": "Customer1",
  "Orders": [
    {
      "Id": "f253837f-5428-405a-880e-2af2b597094c",
      "CustomerGuid": "18a55fea-89cd-438a-bae0-4954193807bf",
      "OrderType": "OrderType1"
    },
    {
      "Id": "0a288fe3-0a00-4372-810f-3d682f82f1dc",
      "CustomerGuid": "18a55fea-89cd-438a-bae0-4954193807bf",
      "OrderType": "OrderType2"
    },
    {
      "Id": "0df4a724-598c-44d7-a6eb-4d597501520f",
      "CustomerGuid": "18a55fea-89cd-438a-bae0-4954193807bf",
      "OrderType": "OrderType0"
    }
  ]
}

現在,我將 JSON 文件中的"Name": "Customer1"更改為"Name": "Customer2" ,我也想從 EF 核心更新 DB。 我希望在帶有"Id": "18a55fea-89cd-438a-bae0-4954193807bf"數據庫客戶中"Id": "18a55fea-89cd-438a-bae0-4954193807bf"Name將是Customer2 我可以使用此 ID 刪除客戶並創建新客戶,但我想更新它。 在這種情況下,我可以這樣做:

 var customerFromJson = JsonConvert.DeserializeObject<Customer>(json);
 var customerFromDB = context.GetEntities<Customer>().Single(c => c.Id == customerFromJson.Id);
 customerFromDB.Name = customerFromJson.Name;
 context.SaveChanges();

但是除了Name屬性之外,還可以有其他屬性,我不想手動執行此操作。 有什么好的解決方案,硬代碼或其他方法來解決這個問題?

我建議為此使用 AutoMapper。 因此,您獲取實體並將 json 對象中的所有字段映射到其中:

mapper.Map(customerFromJson, customerFromDB);
context.SaveChanges();

沒有一種簡單的方法可以做到這一點。 正如 Gleb 所提到的,您可以使用 automapper(得到我的贊成),但要小心。

json 中不存在的值將變為空值,空值將被復制到數據庫中。 所以不要忘記添加條件。 在 Automapper 6 中映射期間如何忽略所有源成員的空值?

另一種方法是使用反射並根據您的 json 檢查目標中存在哪些屬性。 這幾乎就是 automapper 所做的。

即便如此,這兩種解決方案都使用了性能繁重的反射。 您針對幾列的解決方案最有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM