如何编辑DataGridView并将更改发送回实体(LINQ)



我有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实例)应用更改。

最新更新