代码之家  ›  专栏  ›  技术社区  ›  Eric J.

为什么ef4中的POCO需要“Fixup”?

  •  15
  • Eric J.  · 技术社区  · 14 年前

    Entity Framework 4的一个备受期待的特性是能够以不知道持久性的方式使用POCO(普通的旧CLR对象)(即,它们不“知道”它们是用Entity Framework持久化的,而不是其他机制持久化的)。

    我在想为什么有必要在我的“普通”业务对象中执行关联修复和使用FixupCollection。这个要求似乎意味着业务对象毕竟不能完全不知道持久性机制(事实上,“fixup”这个词听起来像是需要修复/修改一些东西才能使用所选的持久性机制)。

    具体来说,我指的是由 ADO.NET POCO实体生成器 ,例如:

        #region Association Fixup
    
        private void FixupImportFile(ImportFile previousValue)
        {
            if (previousValue != null && previousValue.Participants.Contains(this))
            {
                previousValue.Participants.Remove(this);
            }
    
            if (ImportFile != null)
            {
                if (!ImportFile.Participants.Contains(this))
                {
                    ImportFile.Participants.Add(this);
                }
                if (ImportFileId != ImportFile.Id)
                {
                    ImportFileId = ImportFile.Id;
                }
            }
        }
    
        #endregion
    

    以及FixupCollection的使用。其他常见的持久性表单没有类似的限制。

    这在实践中是如何实现的,端到端的?例如,我知道最近才为ObservaleCollection添加了支持(Silverlight和WPF需要它)。其他软件层是否与EF兼容的POCO对象的设计要求有矛盾?

    1 回复  |  直到 13 年前
        1
  •  17
  •   Glorfindel Randy Levy    3 年前

    找到一些解释-看看!

    POCO Template Code Generation Options (英孚团队博客)

    为每个 实体上的导航属性,以及 是从 其目的是确保 关系保持同步 其他。 客户与客户的关系 fixup方法确保 订单在客户订单中 收藏。它还能保持 对应外键属性 即。Order.CustomerID与 新客户主键(ID)值。 实体独立于 EF堆栈,类似于编写测试 对付那些不打电话的人 对象图以相同的方式连接 就像你在使用 他们和EF。修正方法有点 写起来很复杂,因此 自动生成它们很有用,如果 您正计划使用这些实体 在EF独立的场景中。

    再看看这个 POCO in the Entity Framework Part 1 它也有一些关于什么是修正和它们需要什么的章节。