2008-09-17 7 views
7

Obtengo el concepto de crear un objeto o entidad comercial para representar algo así como una Persona. Luego puedo serializar a la Persona que usa un DTO y enviarlo al cliente. Si el cliente cambia el objeto, puede tener una bandera IsDirty allí para que cuando se envíe de vuelta al servidor sé que para actualizarlo.¿Cómo realizar un seguimiento de los cambios en los objetos comerciales?

Pero, ¿qué sucede si tengo un objeto Order? Tiene la información principal del encabezado, el cliente, el proveedor, la fecha requerida, etc. Luego tiene OrderItems que es una lista < OrderItem>, que son los artículos que se ordenan. Quiero poder usar este objeto comercial en mi UI. Así que tengo algunos cuadros de texto conectados a la ubicación, el proveedor, la fecha requerida, etc. y una cuadrícula conectada a los artículos de pedido. Como OrderItems es una lista, puedo agregar y eliminar registros fácilmente. Pero ¿cómo hago un seguimiento de esto, especialmente los elementos eliminados? No quiero que los elementos eliminados sean visibles en mi grilla y no debería poder iterar sobre ellos si utilicé foreach, porque han sido eliminados. Pero aún necesito seguir el hecho de que hubo una eliminación. ¿Cómo hago un seguimiento de los cambios? Creo que necesito usar una unidad de trabajo? Pero luego el código parece volverse bastante complejo. Entonces, me pregunto por qué no simplemente usar DataTables y obtener el seguimiento de cambios de forma gratuita. Pero luego leo cómo los objetos comerciales son el camino a seguir.

He encontrado varios ejemplos de ejemplos de personas simples, ejemplos de detalles de cabecera no como ejemplos.

BTW usando C# 3.5 para esto.

Respuesta

-1

los objetos de datos no rastrean los cambios. el seguimiento de cambios se produce en el DataContext y los objetos que ha recuperado a través del DataContext. Así que con el fin de realizar un seguimiento de los cambios que hay que hacer lo siguiente:

public class FooDataContext : DataContext 
{ 
    public Table<Order> Orders; 
} 

public class Order 
{ 
     [DbColumn(Identity = true)] 
     [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] 
     public int Id { get; set; } 

     [DbColumn(Default = "(getutcdate())")] 
     [Column(DbType = "DateTime", CanBeNull = false, IsDbGenerated = true)] 
     public DateTime DateCreated { get; set; } 

     [Column(DbType = "varchar(50)", CanBeNull = false, IsDbGenerated = false)] 
     public string Name { get; set; } 
} 

En su código subyacente puede hacer algo como:

public void UpdateOrder(int id, string name) 
{ 
    FooDataContext db = new FooDataContext(); 
    Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault(); 

    if (order == null) return; 

    order.Name = name; 

    db.SubmitChanges(); 
} 

No recomendaría directamente utilizando el contexto de datos en el código detrás, pero esta es una buena manera de comenzar con Linq To SQL. Recomendaría poner todas las interacciones de su base de datos en un proyecto externo y llamar desde la GUI a las clases que encapsulan este comportamiento.

Recomendaría crear un archivo Linq To Sql (dbml) si es nuevo en Linq To Sql.

Haga clic derecho en su proyecto en el explorador de soluciones, y seleccione Agregar nuevo elemento. Seleccione el archivo Linq To SQL, y luego le permitirá conectarse a su base de datos y seleccionar las tablas.

Luego puede ver el código generado y obtener algunas buenas ideas sobre cómo funciona Linq To Sql y qué puede hacer con él.

usar eso como una guía sobre cómo trabajar con LINQ a SQL y que te llevará lejos ...

+0

salida fuera del tema !! –

6

En primer lugar, se puede utilizar un marco existente que se ocupa de estas cuestiones, como CSLA.NET. El autor de este marco ha abordado estos mismos problemas. Vaya a http://www.rockfordlhotka.net/cslanet/ para esto. Incluso si no usa el marco completo, los conceptos siguen siendo aplicables.

Si quería hacer su propia versión, lo que hice en el pasado fue usar un tipo personalizado derivado de BindingList en lugar de usar List para mis colecciones. La inclusión de BindingList le permite anular el comportamiento de agregar/quitar elemento. Entonces, por ejemplo, puede tener otra colección interna de elementos "delimitados". Cada vez que se invoca el método de eliminación anulado en su colección, coloque el elemento en la colección "eliminada" y luego llame a la implementación base del método Remove. Puede hacer lo mismo para los elementos añadidos o los elementos cambiados.

2

Estás al tanto de que necesitas una unidad de trabajo, pero no escribas una. Use NHibernate u otro ORM. Para eso están hechos. Tienen una Unidad de Obras incorporada.

Los objetos comerciales son de hecho "el camino a seguir" para la mayoría de las aplicaciones. Estás buceando en un área profunda y habrá mucho que aprender. Mire en DDD.

También recomiendo encarecidamente que no se codifique así en su código subyacente. Mire en el patrón de MVP.

También (mientras me tomaba la molestia de aprender muchas cosas nuevas y muy críticas) miraba SOLID.

Es posible que desee consultar el curso de .NET de JP Boodhoo, ya que abarca muchas de estas cosas.

Cuestiones relacionadas