C# 实体框架在更新时未保存所有属性
我试图用自定义getter和setter更新实体,但如果编辑实体上的任何其他属性,则不会保存它们。我有一个DTO,它映射到检索到的实体上 DTO: 发生的情况是我的C# 实体框架在更新时未保存所有属性,c#,entity-framework,getter-setter,C#,Entity Framework,Getter Setter,我试图用自定义getter和setter更新实体,但如果编辑实体上的任何其他属性,则不会保存它们。我有一个DTO,它映射到检索到的实体上 DTO: 发生的情况是我的设置未更新。我已经通过了它,并且existingEntity.SettingsJson和existingEntity.Settings都有正确的数据名称和已启用都会得到更新 但是,如果我删除Name和Enabled的分配,则会更新设置 但是,它在实体创建上确实有效,只是在更新上不起作用。我还想指出,我无权访问DbContext 我猜E
设置未更新。我已经通过了它,并且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时,它依赖于跟踪,这就是它不理解设置的原因。如果您无法访问上下文,请参阅我的更新答案,了解解决方法。非常感谢