Хорошо, мы решили это.
Я объясню различные части, чтобы добиться общего массового редактирования для динамических данных с помощью 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();
Я предполагаю, что есть несколько других лучших способов достижения массового обновления,но это работает.Если есть спрос, я добавлю больше кода из нашего решения.Я просто хотел, чтобы вы, ребята, знали, что есть способ.