【问题标题】:Entity Framework: storing as a list of complex type实体框架:存储为复杂类型的列表
【发布时间】:2015-10-23 06:43:59
【问题描述】:

我对实体框架有点陌生,我有以下场景,我想用实体框架在数据库上持久化:

public class Period
{
    public Period() { }
    public DateTime From { get; set; }
    public DateTime To { get; set; }        
}

public class Class1
{
     public Period Validity {get; set;}
}

public class Class2
{
     public List<Period> Validities {get;set;}
}

我可以将 Class1 配置为一个复杂类型,但我不能坚持 Class2。
我可以坚持将 Class2 配置为实体,但是尝试添加 Class1 时 Class1 不起作用。

而且,Period 不是实体,我不想将其视为实体,我不想在 Period 上放置 ID,因为我的模型对它没有意义。它是一个结构,我必须让它成为一个类,已经。

我想保持现有模型不变。 是否有解决方法或可以让我在较低级别定义映射的方法?

NHibernate 4 可以吗?如果值得的话,我已经准备好将我的所有持久层切换到休眠状态! 有什么提示吗?

【问题讨论】:

    标签: c# entity-framework nhibernate entity-framework-6 domain-driven-design


    【解决方案1】:

    如果您尝试将您的(非贫血的)域模型压缩到 ORM 中,您将始终不得不做出妥协。所以这通常不是一个好主意,除非是非常简单的应用程序。

    创建一个持久性模型,该模型由非常简单、只有 getter-setter 的类组成,没有任何逻辑。以适合 EF 的方式制作它们并使用它们来持久化数据。现在将您的持久性模型映射到您的域模型,反之亦然。

    这可能看起来有点矫枉过正,但如果您真的想应用 DDD,这是唯一干净的解决方案。尽量保持两个模型接近,以便映射简单。 Automapper 是这种模型到模型映射的好工具。

    【讨论】:

    • 我担心这是唯一的答案:)
    • 一般来说,这不是唯一可能的解决方案。但是对于使用 DDD 的中型到大型应用程序,它可能是。对不起:-)
    • 这远非唯一可能的解决方案。我曾在几个没有专用“持久性模型”的中型应用程序上工作过。有一些妥协,但很小且可以接受。为值对象式结构提供 Id 就是其中之一(有时 - 并非每个 VO 都必须如此)
    • @guillaume31 我同意,这是每个项目都必须自己做出的架构权衡决定。
    【解决方案2】:

    您在 NHibernate 中使用 can't do exactly what you ask,但我们知道 ORM 都是关于权衡的。你真的从Period 没有 ID 得到什么?您是否曾经尝试使用值相等将来自Class1Period 与来自Class2Period 等同起来?

    我通常更关心 VO 的语义优势而不是它们的形状(无 ID、按值比较等)。换句话说,我认为通过将匿名原始值分组到有名的 VO 中来明确领域概念是比不要将实体误认为值对象或其他方式更重要。

    因此,我愿意牺牲一点“纯度”来仍然获得 ORM 的好处,而不必创建额外的“数据模型”层和随之而来的额外映射。

    这并不意味着您不应该尝试在 Period 作为实体中找到意义。根据您的上下文,这可能是可能的。 This article 显示了一个解决方案,其中 VO 从其宿主对象看时被视为 NHibernate 组件,但在创建/编辑时被视为实体。这可能是一个不错的中间选择。

    【讨论】:

    • 是的,确实 Period 对我来说是一个价值对象。我有一个相等运算符并使用它来表示一系列日期。上面的 ID 真的没有任何意义。 Atm 我正在用 nhibernate 编写我的整个持久层,看起来它真的更好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多