特别是在具有ORM的应用程序中,在类之间进行双向映射是很常见的.像这样:
public class Product
{
private List<Price> HistoricPrices { get; private set;}
}
public class Price
{
private Product Product { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在代码中是否有一种可接受的方式来维护这种关系?那么当我向产品添加价格时,Product属性会自动设置吗?
理想情况下,我正在寻找一个易于重复使用的解决方案.向集合中添加内容然后手动设置相反的关系似乎是错误的.
请注意,这不是关于如何建模产品和价格的问题,这是如何建立双向关系的问题.在很多情况下,这是非常合理的.
LBu*_*kin 18
首先,我认为你的礼物的例子令人困惑 - 像Price这样的东西被建模为一个对象或引用有价格的实体是不常见的.但我认为这个问题是合法的 - 在ORM世界中,这有时被称为图形一致性.据我所知,没有一种明确的方法可以解决这个问题,有几种方法.
让我们从稍微改变示例开始:
public class Product
{
private Manufacturer Manufacturer { get; private set; }
}
public class Manufacturer
{
private List<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
因此,每个产品都有一个制造商,每个制造商都可以有一个产品列表.该模型面临的挑战是,如果Product类和Manufacturer类保持彼此断开的引用,则更新一个可以使另一个无效.
有几种方法可以解决此问题:
消除循环引用.这解决了问题,但使对象模型的表现力降低,难以使用.
更改代码,以便制造商的产品和产品列表中的制造商参考是自反的.换句话说,改变一个会影响另一个.这通常需要一些代码,setter和集合拦截变化并将它们相互反映.
根据另一个管理一个财产.因此,不是在Product中存储对制造商的引用,而是通过搜索所有制造商来计算它,直到找到拥有您的制造商为止.相反,您可以在Product类中保留对Manufacturer的引用,并动态构建Products列表.在这种方法中,您通常会将关系的一侧设为只读.顺便说一下,这是标准的关系数据库方法 - 实体通过在一个地方管理的外键相互引用.
外化两个类的关系并在单独的对象中管理它(通常在ORM中称为数据上下文).当Product想要返回其制造商时,它会询问DataContext.当制造商想要返回产品列表时,它会做同样的事情.在内部,有许多方法可以实现数据上下文,一组双向字典并不罕见.
最后,我要提一下,您应该考虑使用ORM工具(如NHibernate或CSLA)来帮助您管理图形一致性.这通常不是一个容易解决的问题 - 一旦你开始探索多对多关系,一对一关系和对象的延迟加载等情况,它很容易变得非常复杂.您最好使用现有的库或产品,而不是发明自己的机制.
以下是一些关于NHibernate中双向关联的链接,您可能会发现它们很有用.
下面是使用方法#3直接管理关系的代码示例 - 通常是最简单的方法.请注意,只有关系的一侧是可编辑的(在本例中为制造商) - 外部消费者无法直接设置产品的制造商.
public class Product
{
private Manufacturer m_manufacturer;
internal Manufacturer Manufacturer
{
get { return m_manufacturer; }
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6207 次 |
| 最近记录: |