我遇到的问题是Entity Framework没有持久更改数据库。我使用静态方法加载一些值,并抛弃Entity上下文(在using语句中)。
然后将对象加载到WPF DataGrid中,最终用户可以在其中操作它们。
当用户完成更改时,按下“更新”按钮,并将对象列表发送回数据层以持久保存到DB。我可以看到UI中更改的对象反映了它们的新值(即不是数据绑定问题)。
我认为,因为加载了对象的实体上下文已经被处理掉,所以我应该将这些对象附加到新创建的上下文中。正确?当我这样做时,修改对象的实体状态(我可以看到状态设置为)变为“未更改”。数据库没有任何内容。
我错过了什么?!
以下是加载和更新值的代码:
public static List<SSIS_Configuration> GetConfigurationValuesForTenant(string tenantKey, SqlConnectionString connectionString)
{
List<SSIS_Configuration> configStrings = new List<SSIS_Configuration>();
if (connectionString.IsValid())
{
try
{
using (SSISFrameworkEntities entities = new SSISFrameworkEntities(connectionString.ToEDMXString("SSISFramework.SSISFramework")))
{
string configFilterStartingValue = "CommonConfig_" + tenantKey;
configStrings = (from configString in entities.SSIS_Configurations
where configString.ConfigurationFilter.StartsWith(configFilterStartingValue)
select configString).ToList();
}
}
catch { }
}
return configStrings;
}
public static void UpdateConfigurations(List<SSIS_Configuration> configurations, SqlConnectionString connectionString)
{
if (connectionString.IsValid())
{
try
{
using (SSISFrameworkEntities entities = new SSISFrameworkEntities(connectionString.ToEDMXString("SSISFramework.SSISFramework")))
{
foreach (SSIS_Configuration config in configurations)
{
entities.Attach(config);
}
entities.SaveChanges();
}
}
catch { }
}
}
答案 0 :(得分:1)
WPF应用程序是附加实体的场景,因此如果要更改从上下文加载的实体,则不应处置上下文。如果你处理它,你必须实现许多额外的逻辑,因为你必须告诉用户every single change用户对实体和关系所做的新上下文。
因此,在您的场景中,调用Attach只会将实体连接到上下文,但you need to set also their state(将put实体附加到Unchanged
状态)。请注意,您必须根据要执行的操作将状态正确设置为Modified
,Deleted
或Inserted
。如果您更改的实体具有一些也已更改的关系,则您还必须为相关实体设置状态,并且如果实体之间的关系发生更改,您还必须更改关系状态本身。