我有WF项目和这个代码:
public static void fillDataGridUsers(string inDepartment, DataGridView outList)
{
var query = context.Users.Where(g => g.SubDepartment.Department.DepartmentName == inDepartment).Select(i =>
new UsersForEdit
{
Id = i.Id,
Login = i.Login
});
BindingSource bindingSource1 = new BindingSource();
bindingSource1.DataSource = query;
outList.DataSource = bindingSource1;
}
private class UsersForEdit
{
public int Id { get; set; }
public string Login { get; set; }
}
我可以编辑DataGridView,但是不能保存这个。
private void SaveGrid_Click(object sender, EventArgs e)
{
Core.ControlPanel.Manager.saveGridUsers();
}
public static void saveGridUsers()
{
context.SaveChanges();
}
如果我只加载实体表-一切都好。当我尝试加载新的{}我只有ReadOnly DataGridView,当我试着用我想要的数据创建我的表时,我不能把它发回或创建一些链接。
例如我需要新UsersForEdit{Id = i.Id,Login = i.Login,Department = i.Department.DepartmentName});
我可以编辑DataGridView,但是不能保存这个
Context只跟踪实体的变化,这些实体是使用这个上下文具体化的(作为查询结果),或者是添加/附加到它的。当您进行任何投影时,即通过Select
转换查询结果时,您将获得与上下文无关的实体。
因此,这里没有更改跟踪。当用户修改UsersForEdit
实例时,不会将任何更改推回上下文。事实上,SaveChanges
在这种情况下没有任何意义。
匿名类型的实例是不可变的。:当我尝试加载
new {}
时,我只得到ReadOnly DataGridView
var foo = new { A = 1, B = "bar" };
最终编译成如下代码:
class Foo
{
private readonly int _a;
private readonly string _b;
public Foo(int a, string b)
{
_a = a;
_b = b;
}
public int A { get { return _a; } }
public string B { get { return _b; } }
}
因此,您不能更改匿名类型的属性,并且网格视图是只读的。
要实现你想要的,你需要将更改推回到上下文。
可以使用几种方法来解决这个问题。例如,在断开连接的场景中(当加载数据后上下文被丢弃时),您可以自己跟踪更改:记住某处更改的实体,并且,当您需要保存更改时,使用新上下文通过id加载实体,并从视图模型(UsersForEdit
实例)应用更改。