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

时间:2011-08-29 18:20:59

标签: c# wpf entity-framework entity-framework-4

我遇到的问题是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 { }
        }
    }

1 个答案:

答案 0 :(得分:1)

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

因此,在您的场景中,调用Attach只会将实体连接到上下文,但you need to set also their state(将put实体附加到Unchanged状态)。请注意,您必须根据要执行的操作将状态正确设置为ModifiedDeletedInserted。如果您更改的实体具有一些也已更改的关系,则您还必须为相关实体设置状态,并且如果实体之间的关系发生更改,您还必须更改关系状态本身。