使用实体框架持久化WPF中的更改

本文关键字:WPF 持久化 实体 框架 | 更新日期: 2023-09-27 18:07:02

我遇到了一个问题,实体框架没有持续更改到DB。我使用静态方法来加载一些值,Entity上下文被丢弃(在using语句中)。

对象然后被加载到WPF DataGrid中,在那里它们可以被最终用户操作。

当用户完成更改时,按下"更新"按钮,并将对象列表发送回数据层以持久化到DB。我可以看到在UI中改变的对象反映了它们的新值(即不是数据绑定问题)。

我认为,既然加载对象的实体上下文已经被处理了,那么我应该将这些要持久化的对象附加到新创建的上下文中。正确吗?当我这样做时,修改对象的实体状态(我可以看到状态被设置为)更改为"Unchanged"。没有东西持久化到DB。

我到底错过了什么?

下面是加载和更新值的代码:
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 { }
        }
    }

使用实体框架持久化WPF中的更改

WPF应用程序是附加实体的场景,因此如果要更改从上下文加载的实体,则不应处置上下文。如果你处理它,你必须实现很多额外的逻辑,因为你必须告诉一个新的上下文关于用户对实体和关系所做的每一个改变。

所以在你的场景中,调用Attach只会将实体连接到上下文,但你还需要设置它们的状态(将放置实体附加到Unchanged状态)。请注意,您必须根据需要执行的操作正确地将state设置为ModifiedDeletedInserted

如果你改变的实体有一些关系,你必须为相关的实体设置状态,如果实体之间的关系改变了,你必须改变关系本身的状态。