c# - query - MVC Bulk Edit-Linq a Sql List Guardar
sql query mvc (2)
Para hacerme una idea de algunos fundamentos usando MVC y Linq to SQL, estoy trabajando en una adaptación a la aplicación TaskList de Stephen Walther:
Estoy agregando un sistema de edición masiva usando los conceptos descritos en el blog de Steve Sanderson .
Todo esto funciona como se esperaba, sin embargo, estoy teniendo problemas para guardar mi Lista de tareas devuelta. La Publicación en mi BulkEdit recorre la lista devuelta y actualiza cada elemento en mi lista de tareas de LinqToSql db.
Mi vista BulkEdit hereda ViewPage<List<TaskList.Models.Task>>
y es la siguiente:
<%
using (Html.BeginForm())
{
%>
<div id="items">
<%
foreach (var task in ViewData.Model)
{
Html.RenderPartial(
"TaskEditor",
task,
new ViewDataDictionary(ViewData)
{
{"prefix", "tasks"}
}
);
}
%>
</div>
<input type="submit" value="Save changes" />
<%
}
%>
El control TaskEditor hereda System.Web.Mvc.ViewUserControl<Models.Task>
y se ve así:
<div>
<%= Html.Hidden(ViewData["prefix"] + ".index", ViewData.Model.Id) %>
<% var fieldPrefix = string.Format("{0}[{1}].", ViewData["prefix"], ViewData.Model.Id); %>
<%= Html.Hidden(fieldPrefix + "Id", ViewData.Model.Id) %>
Description:
<%= Html.TextBox(fieldPrefix + "TaskDescription", ViewData.Model.TaskDescription)%>
Date:
<%= Html.TextBox(fieldPrefix + "EntryDate", ViewData.Model.EntryDate.ToString("o"))%>
Completed:
<%= Html.CheckBox(fieldPrefix + "IsCompleted", ViewData.Model.IsCompleted)%>
</div>
Los métodos Controller Get y Post son los siguientes:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult BulkEdit()
{
var tasks = from t in db.Tasks orderby t.EntryDate descending select t;
return View(tasks.ToList());
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult BulkEdit(IList<Task> tasks)
{
foreach(Task task in tasks)
{
foreach(Task dbTask in db.Tasks)
{
if (dbTask.Id == task.Id)
{
dbTask.TaskDescription = task.TaskDescription;
dbTask.EntryDate = task.EntryDate;
dbTask.IsCompleted = task.IsCompleted;
}
}
}
db.SubmitChanges();
return RedirectToAction("Index");
}
Mi pregunta es, esto parece demasiado complicado y todavía no he tenido en cuenta las tareas que se agregan o eliminan de la lista. Lo que preferiría hacer es algo así como
db.Tasks = tasks;
y deje que Linq haga toda su magia para determinar cuáles han cambiado y cuáles son nuevos / antiguos.
es posible? ¿O estoy esperando demasiado de Linq tan pronto?
Creo que deberías considerar usar una vista para lograr lo que quieres. la colección ObservebleCollection para guardar los elementos y luego puede tener un enlace en su lista para la vista de esa colección, aún tendría que manejar casos de agregar y eliminar elementos, pero también puede optar por una IBindingList que le dará un BindingListCollectionView que actualizará el DB, todo lo que necesita hacer es llamar a las vistas AddNew () CommitNew (), etc.
HTH, Eric
Estás lidiando con el hecho de que LINQ to SQL no tiene una historia de niveles múltiples. Creo que esto es lo que estás buscando:
http://blog.irm.se/blogs/eric/archive/2008/08/20/Go-Distributed-With-LINQ-to-SQL.aspx
El método Merge que presenta este tipo podría convertirse fácilmente en un "método de extensión" de la clase DataContext y casi sería como si estuviera integrado directamente en LINQ to SQL. Digo casi porque tendrías que incluir el espacio de nombres donde se encuentra tu método de extensión para poder usarlo.