gpt4 book ai didi

c# - 与 NHibernate 的开发人员安全双向关系

转载 作者:太空狗 更新时间:2023-10-30 00:57:42 26 4
gpt4 key购买 nike

我知道如何使用 NHibernate 映射双向关系,但有没有人知道一种有效的技术来使它们“对开发人员安全”。

我的意思是,一旦关系的一端建立,另一端也应该设置,例如:

[Test]
public void TestBidirectionalRelationships_WhenAddingOptionToProduct()
{
var product = new Product();

var productOption = new ProductOption();

product.AddOption(productOption);

Assert.That(product.Options.Contains(productOption));
Assert.That(productOption.Product, Is.EqualTo(product);
}

[Test]
public void TestBidirectionalRelationships_WhenSettingProductOnOption()
{
/* Alternatively, productOption.Product would have no public setter */

var product = new Product();

var productOption = new ProductOption();

productOption.Product = product;

Assert.That(product.Options.Contains(productOption));
Assert.That(productOption.Product, Is.EqualTo(product);
}

如何在不使代码变得异常复杂的情况下实现这一目标,同时又让 NHibernate 满意?

最佳答案

一侧:

class Product
{
public Product()
{
_Options = new List<ProductOption>();
}

ICollection<ProductOption> _Options;
public virtual IEnumerable<ProductOption> ProductOptions
{
get { return _Options.Select(x => x); }
}

public virtual AddOption(ProductOption option)
{
option.Product = this;
}

protected internal virtual AddOptionInternal(ProductOption option)
{
_Options.Add(option);
}
}

多边:

class ProductOption
{
Product _Product;
public virtual Product Product
{
get { return _Product; }
set
{
_Product = value;
_Product.AddOptionInternal(this);
}
}
}

映射:

<class name="Product">
...
<bag name="Options" access="field.pascalcase-underscore">
...
<class name="ProductOption">
...
<many-to-one name="Product" access="field.pascalcase-underscore"/>

从集合中移除选项(从任一侧)留作练习 :-)

关于c# - 与 NHibernate 的开发人员安全双向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4551892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com