[英]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.