簡體   English   中英

實體框架不會在更新時保存所有屬性

[英]Entity Framework not saving all properties on update

我正在嘗試使用自定義getter和setter更新實體,但是如果我在實體上編輯任何其他屬性,則不會保存它們。 我有一個DTO,它映射到檢索到的實體。

DTO:

public class MyEntityDto
{
    public string Id { get; set; }

    public string Name { get; set; }

    public bool Enabled { get; set; }

    public Dictionary<string, string> Settings { get; set; }
}

實體:

public class MyEntity
{
    public virtual Guid Id { get; set; }

    public virtual string Name { get; set; }

    public virtual bool Enabled { get; set; }

    public Dictionary<string, string> Settings { get; set; }

    public virtual string SettingsJson
    {
        get { return JsonConvert.SerializeObject(Settings); }
        set
        {
            Settings = JsonConvert.DeserializeObject<Dictionary<string, string>>(value);
        }
    }
}

更新功能:

public async Task UpdateAsync(dto MyEntityDto)
{
    var existingEntity = await _myRepository.GetByIdAsync(dto.Id);

    existingEntity.Name = dto.Name;
    existingEntity.Enabled = dto.Enabled;
    existingEntity.Settings = dto.Settings;

    await _myRepository.Update(existingEntity);

    // save changes happens at end of request
}

發生的是我的SettingsJson沒有更新。 我已經逐步解決了這個問題,並且existingEntity.SettingsJsonexistingEntity.Settings都具有正確的數據。 NameEnabled不會更新。

但是,如果我刪除NameEnabled的分配, SettingsJson確實會更新。

但是,它確實適用於實體創建,而不適用於更新。 我還要指出,我沒有訪問DbContext

  1. 我猜Entity Framework不知道它應該更新數據庫中的SettingsJson ,因為您從不直接在代碼中對其進行修改。 是的,你修改Settings這是在吸氣劑使用的對象SettingsJson ,但實體框架不跟蹤對象的方式。

    在修改Settings對象之后,但在進行實際更新之前,請嘗試以下操作:

     _myDbContext.Entry(existingEntity).Property(e => e.SettingsJson).IsModified = true; 

    但是,此代碼假定您的DbContext是公開的,而事實並非如此。

編輯:

  1. 如果您無權訪問DbContext ,則必須直接設置SettingsJson屬性,以使Entity Framework在數據庫中對其進行更新。 我了解到,在您當前的實現中,您無需擔心會同時更新實際的字典和字典的JSON表示,但是使用實體框架是不可能的。 您必須嘗試這樣的事情:

     public virtual string SettingsJson { get; set; } // just an auto-implemented property ... existingEntity.Settings = dto.Settings; existingEntity.SettingsJson = JsonConvert.SerializeObject(dto.Settings); // save changes 
  2. 另一個解決方案是直接在SettingsJson的設置器中Settings ,如下所示:

     private Dictionary<string, string> settings // private backing field public Dictionary<string, string> Settings { get { return settings; } set { settings = value; SettingsJson = JsonConvert.SerializeObject(dto.Settings); // EF tracks this } } 

    但是 ,如果在設置字典后將元素添加到字典中,則需要再次重新序列化字典,以更新JSON字符串。 您可以通過使用某種可觀察的字典來動態地解決此問題,但是請確保在需要時(調用更新數據庫之前)僅序列化字典一次。

  3. 這並不是真正的解決方案,但值得深思。 數據庫不了解字典。 您知道,這就是為什么您使用JSON來幫助您的原因。 但是,為什么不簡單地將Setting表添加到數據庫模型呢?

暫無
暫無

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

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