繁体   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