2008-11-20 8 views
5

Estoy usando asp.net mvc para una aplicación. He tomado algunas pautas de la serie de Rob Conery en la tienda de MVC. Estoy usando un patrón de acceso a datos muy similar al que usó en la tienda.Actualización de Linq a SQL que no funciona con el patrón de repositorio

Sin embargo, he agregado una pequeña diferencia al patrón. Cada clase que he creado en mi modelo tiene una propiedad llamada IsNew. La intención en esto es permitirme especificar si debería insertar o actualizar en la base de datos.

Aquí hay algo de código:

En mi controlador:

OrderService orderService = new OrderService(); 
Order dbOrder = orderService.GetOrder(ID); 

if (ModelState.IsValid) 
{ 
    dbOrder.SomeField1 = "Whatever1"; 
    dbOrder.SomeField2 = "Whatever2"; 
    dbOrder.DateModified = DateTime.Now; 
    dbOrder.IsNew = false; 

    orderService.SaveOrder(dbOrder); 
} 

Y luego en el SQLOrderRepository:

public void SaveOrder(Order order) 
{ 
    ORDER dbOrder = new ORDER(); 

    dbOrder.O_ID = order.ID; 
    dbOrder.O_SomeField1 = order.SomeField1; 
    dbOrder.O_SomeField2 = order.SomeField2; 
    dbOrder.O_DateCreated = order.DateCreated; 
    dbOrder.O_DateModified = order.DateModified; 

    if (order.IsNew) 
     db.ORDERs.InsertOnSubmit(dbOrder); 

    db.SubmitChanges(); 
} 

Si cambio el código del controlador para que el dbOrder.IsNew = true ; entonces el código funciona, y los valores se insertan correctamente.

Sin embargo, si configuro el dbOrder.IsNew = false; entonces no pasa nada ... no hay errores, simplemente no actualiza el orden.

Estoy utilizando DebuggerWriter aquí: http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11 para rastrear el SQL que se está generando, y como se esperaba, cuando el valor de IsNew es verdadero, el SQL de inserción se genera y se ejecuta correctamente. Sin embargo, cuando IsNew se establece en falso, parece que no se ha generado SQL, por lo que no se ejecuta nada.

He verificado que el problema aquí (LINQ not updating on .SubmitChanges()) no es el problema.

Cualquier ayuda es apreciada.

Respuesta

7

En su método SaveOrder siempre está creando un nuevo objeto ORDER. Debe cambiar esto para que si order.IsNew es falso, recupere el existente del DB y lo actualice en su lugar.

public void SaveOrder(Order order) 
{ 
    ORDER dbOrder; 
    if (order.IsNew) 
    { 
     dbOrder = new ORDER(); 
     dbOrder.O_ID = order.ID; 
    } 
    else 
    { 
     dbOrder = (from o in db.ORDERS where o.O_ID == order.ID select o).Single(); 
    } 

    dbOrder.O_SomeField1 = order.SomeField1; 
    dbOrder.O_SomeField2 = order.SomeField2; 
    dbOrder.O_DateCreated = order.DateCreated; 
    dbOrder.O_DateModified = order.DateModified; 

    if (order.IsNew) 
     db.ORDERs.InsertOnSubmit(dbOrder); 

    db.SubmitChanges(); 
} 
1

Creo que tiene el problema de que su entidad está separada de su contexto.

Debería intentar adjuntar su entidad a su contexto si desea actualizar. La desventaja de LINQtoSQL es que para el reacoplamiento necesitará el estado original del objeto cuando se separó ...

Otra solución es volver a obtener su entidad del contexto y copiar todos los datos de tu entidad en el parámetro. Esto funcionará hasta que tenga entidades más complejas.

1

Lo que dijo tvanfosson.

Me gustaría agregar que utilizo la lógica donde si Id es igual al valor predeterminado (0 o Vacío si usa las guías), entonces supongo que es nuevo. De lo contrario, si recibo el ID, entonces obtengo el objeto existente y lo actualizo.

Cuestiones relacionadas