[英]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.SettingsJson
和existingEntity.Settings
都具有正確的數據。 Name
和Enabled
不會更新。
但是,如果我刪除Name
和Enabled
的分配, SettingsJson
確實會更新。
但是,它確實適用於實體創建,而不適用於更新。 我還要指出,我沒有訪問DbContext
。
我猜Entity Framework不知道它應該更新數據庫中的SettingsJson
,因為您從不直接在代碼中對其進行修改。 是的,你修改Settings
這是在吸氣劑使用的對象SettingsJson
,但實體框架不跟蹤對象的方式。
在修改Settings
對象之后,但在進行實際更新之前,請嘗試以下操作:
_myDbContext.Entry(existingEntity).Property(e => e.SettingsJson).IsModified = true;
但是,此代碼假定您的DbContext
是公開的,而事實並非如此。
編輯:
如果您無權訪問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
另一個解決方案是直接在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字符串。 您可以通過使用某種可觀察的字典來動態地解決此問題,但是請確保在需要時(調用更新數據庫之前)僅序列化字典一次。
這並不是真正的解決方案,但值得深思。 數據庫不了解字典。 您知道,這就是為什么您使用JSON來幫助您的原因。 但是,為什么不簡單地將Setting
表添加到數據庫模型呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.