Подтвердить что ты не робот

Связывание объектов Entity Framework с Datagridview С#

Я пытаюсь связать объект Entity Framework с DataGridView, но я продолжаю тупик, и я не могу найти ответ нигде.

Я могу привязать всю таблицу (сущность) к gridview, и это позволит мне вносить изменения и сохранять эти изменения обратно в БД следующим образом:

    WS_Model.WS_Entities context;

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        context = new WS_Entities();

        var query = from c in context.Users select c;

        var users = query.ToList();

        gridControl1.DataSource = users;
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
    }

но я не хочу видеть все столбцы из таблицы в моей БД в моем datagridview, поэтому я попытался сделать это таким образом...

WS_Entities context = new WS_Entities();

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        var query = from c in context.Users
                    where c.UserName == "James"
                    select new { c.UserName, c.Password, c.Description };

        var results = query.ToList();

        gridControl1.DataSource = results;
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
    }

но теперь я не могу редактировать любые данные в моем DataGridView.

Я не вижу дерева для деревьев здесь, пожалуйста, кто-то не укажет на нашу ошибку моих путей или сообщит мне, что лучше всего подходит для привязки EF к Winforms, поскольку я получаю утечку мозгов.

Я вижу, что это касается раздела:

select new { c.UserName, c.Password, c.Description }

Но я не знаю, почему.

4b9b3361

Ответ 1

Проблема с линией:

select new { c.UserName, c.Password, c.Description }

Это то, что он создает анонимный тип а анонимные типы неизменяемы - это только чтение. Вот почему ваши изменения не отражаются ни в новом типе, ни в исходном объекте EF.

Теперь, что касается способов не показывать все столбцы объекта, к которому вы привязываетесь, я дал три варианта ниже.

Скрыть нежелательные столбцы

Самый простой подход - установить для свойства visible значение false для столбцов, которые вы не хотите показывать.

dataGridView1.Columns[0].Visible = false;

Если значение в индексе индекса коллекции столбцов может быть целым числом, определяющим местоположение столбца или строку для имени столбца.

Пользовательский объект в EF для этой привязки данных

Вы также можете обработать это на уровне EF - создание настраиваемого объекта для вашей привязки, который EF отображает из базы данных без столбцов, которые вы не хотите. Я вообще не использовал EF 4.0, но я понимаю, что он имеет эту возможность сейчас.

Пользовательский DTO, спроецированный из объекта EF, а затем отображенный назад

Третий вариант (и они идут от хорошего к плохому, по моему мнению, но я думал, что расскажу вам несколько подходов!) - это запрос к конкретному типу, а затем возврат к объекту EF. Что-то вроде:

private class DataBindingProjection
{
    public string UserName { get; set; };
    public string Password { get; set; };
    public string Description { get; set; };
}

private void simpleButton1_Click(object sender, EventArgs e)
{
    context = new WS_Entities();
    var query = from c in context.Users
                where c.UserName == "James"
                select new DataBindingProjection { UserName = c.UserName, Password = c.Password, Description = c.Description };
    var users = query.ToList();
    gridControl1.DataSource = users;
}

private void simpleButton2_Click(object sender, EventArgs e) 
{
    // and here you have some code to map the properties back from the 
    // projection objects to your datacontext

    context.SaveChanges();
}

В определенных ситуациях, которые могут быть работоспособным решением тоже...