我有一个与用户实体对应的详细视图。每个用户实体都有一个或多个注释实体,它们在详细视图中表示为网格。
因此,遵循EF约定,用户模型具有UserComments成员来表示关系:
#include <locale>
std::wstring line;
while (std::getline(iss, line, L';'))
{
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> conv;
std::string str = conv.to_bytes(line);
// use str as needed...
MessageBoxW(0, line.c_str(), L"line", 0);
MessageBoxA(0, str.c_str(), "str", 0);
}
当在用户详细信息视图中创建用户注释网格时,我意识到网格没有正确绑定到ICollection(无法向网格添加新行)。经过一番挖掘,我发现我需要使用ObservervableColletion。好的,所以我将ICollection转换为ObserverableCollection ....
public partial class User
{
public int UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<UserComments> UserComments { get; set; }
//....
}
冷却。我现在可以在网格中添加行。但...
此时,我已经意识到我已经通过将User.UserComments转换为ObservableCollection来丢失EF更改跟踪,并且没有简单的方法可以将修改后的/新注释转回EF。
所以我接近这一切都错了吗?有更好的方法来更新相关数据吗?
答案 0 :(得分:3)
为了让EF跟踪集合更改,您需要在模型本身中添加和删除集合。
this._UserComments = new ObservableCollection<UserComment>(UserData.UserComments);
在上面一行中,您需要copying elements创建一个集合,因此当在UserDetailViewModel.UserComments
添加或删除项目时,这些项目实际上并未添加到或已从User.UserComments
移除。
解决此问题的一些选项包括:
将User.UserComments
本身更改为ObservableCollection
并在视图模型中公开它。例如:
public class UserDetailViewModel
{
public virtual User UserData { get; set; }
public ObservableCollection<UserComment> UserComments
{
get { return UserData.UserComments; }
}
// other stuff...
}
UserDetailViewModel.UserComments
的添加/删除事件并修改那里的User.UserComments
集合。