Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架在更新时未保存所有属性_C#_Entity Framework_Getter Setter - Fatal编程技术网

C# 实体框架在更新时未保存所有属性

C# 实体框架在更新时未保存所有属性,c#,entity-framework,getter-setter,C#,Entity Framework,Getter Setter,我试图用自定义getter和setter更新实体,但如果编辑实体上的任何其他属性,则不会保存它们。我有一个DTO,它映射到检索到的实体上 DTO: 发生的情况是我的设置未更新。我已经通过了它,并且existingEntity.SettingsJson和existingEntity.Settings都有正确的数据名称和已启用都会得到更新 但是,如果我删除Name和Enabled的分配,则会更新设置 但是,它在实体创建上确实有效,只是在更新上不起作用。我还想指出,我无权访问DbContext 我猜E

我试图用自定义getter和setter更新实体,但如果编辑实体上的任何其他属性,则不会保存它们。我有一个DTO,它映射到检索到的实体上

DTO:

发生的情况是我的
设置未更新。我已经通过了它,并且
existingEntity.SettingsJson
existingEntity.Settings
都有正确的数据<代码>名称
已启用
都会得到更新

但是,如果我删除
Name
Enabled
的分配,则会更新
设置

但是,它在实体创建上确实有效,只是在更新上不起作用。我还想指出,我无权访问
DbContext

  • 我猜Entity Framework不知道它应该在数据库中更新
    SettingsJson
    ,因为您从未在代码中直接修改它。是的,您可以修改
    设置
    对象,该对象在
    设置
    的getter中使用,但实体框架不会以这种方式跟踪对象

    在修改
    设置
    对象之后,但在执行实际更新之前,请尝试以下操作:

    _myDbContext.Entry(existingEntity).Property(e => e.SettingsJson).IsModified = true;
    
    但是,此代码假定您的
    DbContext
    已公开,但情况可能并非如此

  • 编辑:

  • 如果您无权访问
    DbContext
    ,则必须直接设置
    SettingsJson
    属性,以便实体框架在数据库中更新它。我知道在您当前的实现中,您永远不需要同时更新实际的字典和字典的JSON表示,但在Entity Framework中这是不可能的。您必须尝试以下方法:

    public virtual string SettingsJson { get; set; } // just an auto-implemented property
    
    ...
    
    existingEntity.Settings = dto.Settings;
    existingEntity.SettingsJson = JsonConvert.SerializeObject(dto.Settings);
    // save changes
    
  • 另一种解决方案可以是直接在
    设置的setter中设置
    SettingsJson
    ,如下所示:

    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
        }
    }
    
    专用字典设置//专用备份字段
    公共词典设置
    {
    获取{返回设置;}
    设置
    {
    设置=值;
    SettingsJson=JsonConvert.SerializeObject(dto.Settings);//EF跟踪此
    }
    }
    
    但是,如果在设置字典后向字典中添加元素,则需要重新序列化字典,以便更新JSON字符串。您可以通过使用某种可观察的字典来动态地解决这个问题,但请确保它只在需要时序列化字典一次(在调用更新数据库之前)

  • 这不是一个真正的解决方案,但值得深思。数据库不理解字典。你知道,这就是为什么你要使用JSON来帮助你。但是,为什么不简单地向数据库模型添加一个
    设置
    表呢

  • 我猜Entity Framework不知道它应该在数据库中更新
    SettingsJson
    ,因为您从未在代码中直接修改它。是的,您可以修改
    设置
    对象,该对象在
    设置
    的getter中使用,但实体框架不会以这种方式跟踪对象

    在修改
    设置
    对象之后,但在执行实际更新之前,请尝试以下操作:

    _myDbContext.Entry(existingEntity).Property(e => e.SettingsJson).IsModified = true;
    
    但是,此代码假定您的
    DbContext
    已公开,但情况可能并非如此

  • 编辑:

  • 如果您无权访问
    DbContext
    ,则必须直接设置
    SettingsJson
    属性,以便实体框架在数据库中更新它。我知道在您当前的实现中,您永远不需要同时更新实际的字典和字典的JSON表示,但在Entity Framework中这是不可能的。您必须尝试以下方法:

    public virtual string SettingsJson { get; set; } // just an auto-implemented property
    
    ...
    
    existingEntity.Settings = dto.Settings;
    existingEntity.SettingsJson = JsonConvert.SerializeObject(dto.Settings);
    // save changes
    
  • 另一种解决方案可以是直接在
    设置的setter中设置
    SettingsJson
    ,如下所示:

    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
        }
    }
    
    专用字典设置//专用备份字段
    公共词典设置
    {
    获取{返回设置;}
    设置
    {
    设置=值;
    SettingsJson=JsonConvert.SerializeObject(dto.Settings);//EF跟踪此
    }
    }
    
    但是,如果在设置字典后向字典中添加元素,则需要重新序列化字典,以便更新JSON字符串。您可以通过使用某种可观察的字典来动态地解决这个问题,但请确保它只在需要时序列化字典一次(在调用更新数据库之前)

  • 这不是一个真正的解决方案,但值得深思。数据库不理解字典。你知道,这就是为什么你要使用JSON来帮助你。但是,为什么不简单地向数据库模型添加一个
    设置
    表呢


  • 我注意到在您的实体类中,除dictionary对象外,所有对象都声明为虚拟。@bilpor EF无论如何都不支持字典,因此它不会存储在DB中。什么是
    QueueSettings
    ?@RuudLenders抱歉,只是想说
    Settings
    。我注意到在您的实体类中,除了字典对象。@bilpor EF无论如何都不支持字典,因此它不会存储在数据库中。什么是
    QueueSettings
    ?@RuudLenders Sorry只是想说
    Settings
    。是的,很遗憾,我没有访问上下文的权限。因此,如果我从未在代码中直接修改属性,它如何在创建时成功保存它?那不一样吗?@KevinLee是的,不一样。插入新记录时,Entity Framework会接收上下文未跟踪的对象。它不知道设置了哪些属性,哪些属性没有设置,因此在插入时将全部使用它们。当更新EF时,它依赖于跟踪,这就是它不理解设置的原因。如果您无法访问上下文,请参阅我的更新答案,了解解决方法。非常感谢