gpt4 book ai didi

nhibernate - 建模一对零或一对关系(Z 基数)

转载 作者:行者123 更新时间:2023-12-03 12:25:31 31 4
gpt4 key购买 nike

我正在努力寻找建模 1 : 0,1 关系的最佳方法(“可能有一个”或“最多有一个”)。我相信这被称为 Z 基数。

例如,假设我有两个类 WidgetWidgetTest .并非所有 Widget 都经过测试,并且测试是破坏性的,因此每个 Widget 最多可以有一个 WidgetTest。还假设将 WidgetTest 字段添加到 Widget 是不合适的。

我希望我的公共(public)界面是:

Widget
WidgetTest { get; set; }

WidgetTest
Widget { get; }

模型 1:Widget 具有 WidgetTest 属性,并且在数据库中,Widget 表具有 WidgetTest 的唯一约束外键。我的 DBA 认为这将允许 WidgetTest 记录在没有 Widget 的情况下存在。
WidgetTable
WidgetTestId (FK, UQ)

模型 2:Widget 具有 WidgetTest 的私有(private)集合,并通过从由公共(public) WidgetTest 属性控制的集合中添加或删除单个对象来强制执行 0,1 关系。数据库将其建模为 1:m,其中 WidgetTest 具有对 Widget 的唯一约束外键。我认为这意味着采用模型来适应数据库模式(即我需要做更多的工作)。
WidgetTestTable
WidgetId (FK, UQ)

哪个型号更好?使用 NHibernate 哪个更容易实现?还是有第三种方法?

编辑......这是我最终得到的结果:
public class Widget
{
// This is mapped in NH using a access strategy
private IList<WidgetTest> _widgetTests = new List<WidgetTest>(1);

public WidgetTest
{
get { return _widgetTests.FirstOrDefault(); }
set
{
_widgetTests.Clear();
if (value != null)
{
_widgetTests.Add(value);
}
}
}
}

最佳答案

我的方法是在映射中建模一对多关系,但将“多”限制为单个项目。这允许可选的一对一,并且还保证您的 WidgetTest 实例在您保存 Widget 时保持不变。例如:

public class Widget
{
/// <summary>
/// This property is ignored by the NHibernate mappings.
/// </summary>
public virtual WidgetTest WidgetTest { get; set; }

/// <summary>
/// For easier persistence with NHibernate, this property repackages the
/// WidgetTest property as a list containing a single item. If an
/// attempt is made to set this property to a list containing more than
/// one item, an exception will be thrown. But why bother? Just use the
/// WidgetTest property.
/// </summary>
public virtual IList<WidgetTest> WidgetTests
{
get
{
IList<WidgetTest> widgetTests = new List<WidgetTest>();
if (this.WidgetTest != null)
{
widgetTests.Add(this.WidgetTest);
}
return widgetTests;
}
set
{
if (value != null && value.Count > 1)
{
throw new Exception("The WidgetTests collection may not contain more than one item.");
}
else if (value != null && value.Count == 1)
{
this.WidgetTest = value[0];
}
else
{
this.WidgetTest = null;
}
}
}
}

关于nhibernate - 建模一对零或一对关系(Z 基数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208796/

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