En primer lugar, creo que el ejemplo de su presente es confuso - es raro que algo así como a Precio que se modelará como un objeto o que tenga referencia a las entidades que tendrían un precio. Pero creo que la pregunta es legítima: en el mundo de ORM, esto se conoce como consistencia de gráficos. Que yo sepa, no hay uno manera definitiva de abordar este problema, hay varias formas. inicio
Vamos cambiando un poco el ejemplo:
public class Product
{
private Manufacturer Manufacturer { get; private set;}
}
public class Manufacturer
{
private List<Product> Products { get; set; }
}
Así que cada producto tiene un fabricante, y cada fabricante podría tener una lista de productos. El desafío con el modelo es que si la clase Producto y la clase Fabricante mantienen referencias desconectadas entre sí, la actualización de uno puede invalidar el otro.
Hay varias maneras de abordar este problema:
Eliminar la referencia circular. Esto resuelve el problema pero hace que el modelo de objeto sea menos expresivo y más difícil de usar.
Cambie el código para que la referencia del fabricante en la lista de productos y productos en el fabricante sea reflexivo. En otras palabras, cambiar uno afecta al otro. En general, esto requiere algún código para que el colocador y la colección intercepten los cambios y los reflejen en uno.
Gestione una propiedad en términos de la otra.Por lo tanto, en lugar de almacenar una referencia a un fabricante dentro del Producto, lo calcula buscando entre todos los Fabricantes hasta que encuentre el que le pertenece. Por el contrario, puede mantener una referencia al Fabricante en la clase de Producto y crear la lista de Productos dinámicamente. En este enfoque, generalmente harías que un lado de la relación sea de solo lectura. Por cierto, este es el enfoque estándar de la base de datos relacional: las entidades se refieren entre sí a través de una clave externa que se gestiona en un solo lugar.
Externalice la relación desde ambas clases y adminístrelo en un objeto separado (a menudo llamado contexto de datos en ORM). Cuando Product quiere devolver su fabricante, le pide a DataContext. Cuando el fabricante desea devolver una lista de productos, hace lo mismo. Internamente, hay muchas maneras de implementar un contexto de datos, un conjunto de diccionarios bidireccionales no es infrecuente.
Por último, mencionaré, que usted debe considerar el uso de una herramienta ORM (como NHibernate o CSLA) que pueden ayudarle a gestionar la coherencia gráfica. En general, este no es un problema fácil de resolver correctamente, y puede complicarse fácilmente una vez que comienzas a explorar casos como relaciones de muchos a muchos, relaciones uno a uno y cargas de objetos perezosos. Es mejor utilizar una biblioteca o producto existente, en lugar de inventar un mecanismo propio.
Estos son algunos links que hablan de bidirectional associations en NHibernate que puede que sean útiles.
Aquí hay un ejemplo de código de administración de las relaciones directamente con el método # 3, que suele ser el más simple. Tenga en cuenta que solo un lado de la relación es editable (en este caso, el fabricante): los consumidores externos no pueden establecer directamente el fabricante de un producto.
public class Product
{
private Manufacturer m_manufacturer;
private Manufacturer Manufacturer
{
get { return m_manufacturer;}
internal set { m_manufacturer = value; }
}
}
public class Manufacturer
{
private List<Product> m_Products = new List<Product>();
public IEnumerable<Product> Products { get { return m_Products.AsReadOnly(); } }
public void AddProduct(Product p)
{
if(!m_Products.Contains(p))
{
m_Products.Add(p);
p.Manufacturer = this;
}
}
public void RemoveProduct(Product p)
{
m_Products.Remove(p);
p.Manufacturer = null;
}
}
Quizás se debería elegir un ejemplo diferente, ya que este ejemplo no demuestra la necesidad de tal relación. –