我在我的应用程序中使用EF数据库优先模型。这是WPF MVVM应用程序,所以我使用长时间生活的DbContext,它在应用程序启动时创建并在完成时处理。实体框架6使用另一个记录的值更新现有记录
有两个表 - clients
和settings
。 settings
将所有客户端的设置存储为client_id
作为外键,settings_id
作为主键。 在这settings
表我有一些'默认'记录settings_id=1
和client_id=1
。我希望我的应用程序通过按下按钮来恢复客户端的“默认”设置。
以我vewmodel我有Client
类型,这是我的分贝实体模型类的ObservableCollection
,并Client
类型的属性SelectedClient
,绑定到当前选定的客户机(在一些列表框)。我也有实体类Settings
,其中有一些字段代表设置表中的不同设置。我想从'默认'记录中的所有这些设置来替换当前选定的客户端设置。
我做那么什么是:
public void OnResetClientSettingsCommandExecute()
{
var defaultSettings = Global.DbContext.Settings.FirstOrDefault(c => c.client_id == 1);
if (defaultSettings == null) return;
var tmp = defaultSettings;
tmp.client_id = SelectedClient.client_id; // doing this to change the only field which needs to remain untouched
var selectedClientSettings = Global.DbContext.Settings.FirstOrDefault(c => c.client_id == SelectedClient.client_id);
selectedClientSettings = tmp;
Global.DbContext.SaveChanges();
}
此代码不能在所有的工作。我唯一得到的 - 在settings
到SelectedClient
的client_id处将我的'默认'记录更改为client_id
。我不知道为什么会发生,我想如果我使用tmp
它会好的,但不会。 我知道有一些做法使用Attach()
方法或更改实体的State
到Modified
- 我试过所有这些,没有人为我工作,我想因为我使用长寿DbContext方法。我很困惑在我的应用程序中更新记录 - 我只是不能这样做,DbContext.SaveChanges()方法不保存对数据库的更改,但由于某种原因将它们回滚。所以我必须使用原始的SQL查询,这是一个石器时代。
请别人帮我弄清楚我做错了什么。谢谢。
你想在你的数据库中创建另一行的默认设置值,并链接到选定的客户端ID吗? – dbraillon
不,我已经有了一条线,我想用默认的字段替换它的所有字段,除了client_id字段 –
正如你应该注意到的那样,你不能像你这样做。 'var tmp = defaultSettings;'不会创建一个新的对象,它只会创建一个新的对已经存在的对象的引用。 – dbraillon