我在确定使用Entity Framework更新外键字段的正确方法时遇到了问题。我在数据库中更新它们没有问题,而是在界面上更新。
以下是我的问题的相关表格 文件:/// C:/Users/Mike/Desktop/RelevantTables.bmp
我有一个带有Master / Detail类型视图的“Team”表单(master = Team,detail = Player),并在ListView中显示玩家。双击播放器时,我会显示“编辑播放器”表单。
以下是我在TeamForm Window_Loaded事件中加载数据的方法:
var TeamQuery = from t in ScoresDB.Team
.Include("School").Include("TeamLevel").Include("Player.PlayerPosition")
.Where(x => x.TeamID == TeamID)
select t;
TeamData = new TeamCollection(TeamQuery, ScoresDB);
TeamViewSource = (CollectionViewSource)FindResource("TeamViewSource");
PlayerViewSource = (CollectionViewSource)FindResource("PlayerViewSource");
TeamViewSource.Source = TeamData;
TeamView = (ListCollectionView)TeamViewSource.View;
TeamView.CurrentChanged += new EventHandler(TeamView_CurrentChanged);
PlayerView = (BindingListCollectionView)PlayerViewSource.View;
这是我在用户想要编辑播放器时所做的事情:
// If the user made changes to the player, then refresh our view
if (PlayerForm.EditPlayer(SelectedPlayer.PlayerID)) {
ScoresDB.Refresh(System.Data.Objects.RefreshMode.ClientWins, PlayerView);
}
我的问题是,尽管每个不是外键的字段确实反映了ListView中的更改,但PlayerPosition却没有。它正在数据库中正确更改。我是否每次都需要重新查询数据库?
我明显感觉到我所做的一切都很糟糕,因为我刚刚开始跋涉WPF和EF。
如果有人知道发生了什么,或者只是想告诉我这样做有多愚蠢,那对我来说没关系!
提前致谢, 麦克
答案 0 :(得分:1)
我要么完全迟钝,要么太累,要么两者兼而有之。我投票两个! :)
这只需要一行代码,即为我的BindingListCollectionView(PlayerView)调用名称非常合适的Refresh()方法。
所以我只需更改我的编辑播放器,如下所示:
if (PlayerForm.EditPlayer(SelectedPlayer.PlayerID)) {
ScoresDB.Refresh(System.Data.Objects.RefreshMode.ClientWins, PlayerView);
// Added this line and it works
PlayerView.Refresh();
}
我希望没有人在这个上花太多时间。当我只是更新数据库时,我不完全确定为什么非关系字段会更新,但它现在可以正常工作,这至少是一些东西!
谢谢, 麦克