c# - 是一对一的关系糟糕的策略

标签 c# .net nhibernate domain-driven-design

用户总是有一个钱包。一个钱包始终属于一个用户。

因为我想分离与钱钱包相关的属性,所以我创建了 Wallet 对象并能够跟踪钱交易,......我创建了

public Wallet : Entity<int>
{
    public double Amont {get; set;}
    public IList<MoneyTrans> Transactions {get; set;}
}

由于这显然是一对一的关系,是否可以使用一对一的关系进行映射?

一对一是不好的策略吗?

最佳答案

我不得不附加答案,观点相反。不要使用一对一映射。至少对于 NHibernate。

我不是在谈论概念领域驱动设计。关于我在数据库设计和 NHibernate 使用方面的经验。

1) 一对一 - 刚性数据库设计

首先,当业务需求发生变化时,使用共享主键进行设计(继承除外)可能会在以后导致许多问题。

典型场景,与示例非常相似23.2. Author/Work ,其中 Author一对一映射到 Person。因此,Author 的 id(主键)来自于一个 Person(id)。业务迟早会来问我们是否可以将人员映射到作者(参见 Lars Kepler 示例)

我在这里想说的是:Chapter 24. Best Practices (让我引用一点)

Declare identifier properties on persistent classes.

NHibernate makes identifier properties optional. There are all sorts of reasons why you should use them. We recommend that identifiers be 'synthetic' (generated, with no business meaning) and of a non-primitive type. For maximum flexibility, use Int64 or String.

如此处(以及我的经验)所述,让所有实体都拥有自己的代理主键是非常有益的。稍后关系的变化 - 只会影响引用(在代理键之上),而不影响表/实体本身。

2) 一对一与NHibernate 不能偷懒

事实上这就是一个原因,为什么 (尽管我尝试了几次) 目前根本不使用 one-to-one一对一不支持延迟加载。搜索更多信息,但可以在此处找到很好的解释:

如问题下方评论中的链接之一所述(引用)

  1. You can either include all those attributes as columns into your entity table - but in that case, lots of columns would end up empty for a significant number of the entries.

  2. Or: you can put those "optional" attributes into a separate table, set up a 1:1 (or rather: 0:1) relationship with the base entity table,

嗯,使用 NHiberante 不会有太大的改进。这个建议是错误的。 Lazy loading of one-to-one isn't supported...

总结:

这就是我强烈建议的原因:尽可能使用多对一一对多。你会收获更多...

关于c# - 是一对一的关系糟糕的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23425600/

相关文章:

c# - 通过 cmd 行传递消息的单实例应用程序?

c# - 这很有用,但我不确定为什么会起作用

c# - 使用 EmailAddressAttribute 在 .net 中验证电子邮件字符串,但不在属性上

Nhibernate - 映射列表不更新列表索引

c# - 实体中的 NHibernate 辅助属性

c# - 在一个对象中表示 n 个对象

c# - 没有参数传递给自定义 DataTemplateSelector 的 SelectTemplate()。为什么?

c# - 有没有办法从 .NET 应用程序中的 WebBrowser 控件内部启用 IE8 开发人员工具

c# - 用于抑制空列表的 XmlSerialization 的魔法名称

nhibernate - 使用NHibernate和QueryOver联接多个表