我正在尝试在Winforms中使用EF7,并且我想使用BindingList来支持双向绑定
在EF6中,我可以通过调用.ToBindingList来完成
_context = new ProductContext();
_context.Categories.Load();
this.categoryBindingSource.DataSource =
_context.Categories.Local.ToBindingList();但是,在EF7中,既没有Local属性,也没有ToBindingList
如何使用EF7在Winforms上实现双向绑定?
发布于 2016-03-10 06:21:59
你永远不应该绑定,尤其是不能直接双向绑定到EF对象。这意味着您将在应用程序的整个生命周期中使用DbContext,随着时间的推移,这将使您陷入麻烦。
大多数情况下,使用EF对象是没有意义的,因为您几乎永远不会向用户显示确切的数据库对象。在大多数情况下,视图将显示多个数据对象的组合。
因此,不是直接使用对象,而是创建定制的视图模型以显示给用户,您可以从新的DbContext获取视图模型。这些视图模型可以实现INotifyPropertyChanged。
完成获取后,释放DbContext,并在用户想要保存任何更改时创建一个新的any。
下面是一个简单的示例:
public class UserViewModel : INotifyPropertyChanged
{
public int UserId { get; set; }
public string UserName { get; set; }
public int GroupId { get; set; }
public string GroupName { get; set; }
// INotifyPropertyChanged implementation or use Fody
}
public class UserModel
{
public int Id { get; set; }
public string Name { get; set; }
public virtual GroupModel Group { get; set; }
}
public class GroupModel
{
public int Id { get; set; }
public string Name { get; set; }
public virtual HashSet<UserModel> Users { get; set; }
}
public class UserRepository
{
public IEnumerable<UserViewModel> GetUsers()
{
using (var db = new YourDbContext())
{
return (
from user in db.Users
select new UserViewModel
{
UserId = user.Id,
UserName = user.Name,
GroupId = user.Group.Id,
GroupName = user.Group.Name,
}).ToArray();
}
}
public void SaveChanges(UserViewModel user)
{
using (var db = new YourDbContext())
{
// get user
// modify and...
db.SaveChanges();
}
}
} 可以轻松地将结果包装在BindingList中
https://stackoverflow.com/questions/35903428
复制相似问题