Динамические данные с Entity Framework: массовое редактирование строк - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть веб-сайт администратора продукта, созданный с использованием ASP.NET Dynamic Data и Entity Framework 4.1 (Code First).

Я начал создавать способ массового редактирования строк. У меня есть элементы управления для редактирования столбцов, которые я хочу иметь возможность массового редактирования (я создал новый атрибут с именем EditableInBulk, которым я украшаю свои свойства). Я также добавил новый столбец в GridView с флажком, который указывает, следует ли массово редактировать строку или нет.

Теперь осталось только то, что мне нужно программно обновить строки, которые я проверил с помощью «Редактировать».

Вот код, который я использую, чтобы найти строки, которые были проверены, единственное, чего не хватает, это обновить данные и сохранить их.

        // Find all items that will be edited
        foreach (GridViewRow row in GridView1.Rows)
        {
            if (row.RowType != DataControlRowType.DataRow)
                continue;

            // Fetch the item index of the rows that has "Edit" checked
            var editMe = row.Cells[1].Controls.OfType<CheckBox>().Any(ch => ch.Checked);
            if (editMe)
            {
                // Edit the fields in the row and persist
            }
        }

Я должен иметь возможность использовать метод UpdateRow в элементе управления GridView. Но перед этим мне нужно обновить поля в строке.

Кто-нибудь знает, как мне этого добиться?

Дело в том, что оно должно быть общим. Должен работать с каждым типом сущности, у которого есть столбцы, которые я украсил своим пользовательским атрибутом "EditableInBulk". Таким образом, не может быть каких-либо специфических сущностей, продолжающихся.

Я начал изменять файл List.aspx, который поставляется с проектом Dynamic Data.

1 Ответ

4 голосов
/ 01 декабря 2011

Хорошо, мы решили это.

Я объясню различные части, чтобы добиться общего массового редактирования для динамических данных с помощью Entity Framework Code First.Решение не красиво.Но это работает.

Создайте атрибут (мы назвали его EditableInBulk), который вы декорируете свойствами в своем классе POCO Entity Framework.

В List.aspx (автоматически сгенерированный динамическими данными) добавьтестолбец с элементом управления CheckBox для вашего вида сетки, чтобы вы могли легко выбрать, какие строки должны быть затронуты массовым обновлением.

На ItemDataBound на GridView, в HeaderRow, добавьте DynamicControl правильного типа в соответствующийколонка.Добавляйте DynamicControl, только если соответствующий MetaColumn украшен EditableInBulk.

Создайте кнопку или каким-либо образом запустите массовое обновление.Прежде всего извлеките новые значения из DynamicControl, которые были созданы в HeaderRow.

Затем выполните итерацию по строкам GridView (с RowType == DataRow).Убедитесь, что текущая строка была выбрана как «подлежащая редактированию» (найдите элемент управления CheckBox в новом столбце и проверьте значение).

Получите идентификатор объекта текущей строки.Но сначала вы должны рассчитать номер строки на основе страницы и размера страницы.В противном случае он не будет работать, если вы находитесь на странице, отличной от первой.

int index = row.DataItemIndex;
if (GridView1.PageIndex > 0)
{
    index = row.DataItemIndex - (GridView1.PageIndex)*GridView1.PageSize;
}
var entityId = Convert.ToInt32(GridView1.DataKeys[index].Value.ToString());

Создание экземпляра ObjectContext из вашего DataContext.

var objectContext = ((IObjectContextAdapter) new YourProject.Data.DataContext()).ObjectContext;

Извлечение имени типа объекта текущегоlist / dataset.

string entityTypeName = GridView1.DataKeyNames[0].Substring(0, GridView1.DataKeyNames[0].Count() - 2);

Создание нового объекта типа EntityKey с помощью идентификатора объекта и типа объекта.Получите объект, который будет отредактирован с помощью ObjectContext

var entityKey = new EntityKey(objectContext.DefaultContainerName + "." + entityTypeName + "s", GridView1.DataKeyNames[0], entityId);

Обратите внимание на решение + "s" ... оно работает :) (счастливый / грустный).

var entity = objectContext.GetObjectByKey(entityKey);

С помощью Reflection установите новые значения свойств.

PropertyInfo prop = entity.GetType().BaseType.GetProperty(newValue.Key, BindingFlags.Public | BindingFlags.Instance);
var typedValue = TypeDescriptor.GetConverter(prop.PropertyType).ConvertFrom(newValue.Value);
                            if (null != prop && prop.CanWrite)
                            {
                                prop.SetValue(entity, typedValue, null);                            }

Сохраните только что обновленную сущность!

objectContext.SaveChanges();

Я предполагаю, что есть несколько других лучших способов достижения массового обновления,но это работает.Если есть спрос, я добавлю больше кода из нашего решения.Я просто хотел, чтобы вы, ребята, знали, что есть способ.

...