代码之家  ›  专栏  ›  技术社区  ›  driAn

Sharepoint:导入列表后查找字段的完整性

  •  1
  • driAn  · 技术社区  · 16 年前

    例如,假设我们有以下两个sharepoint列表:

    Product Types
    -------------
    + Type Name
    + Code Nr
    + etc
    
    
    Products
    --------
    + Product Name
    + Product Type (Lookup field to list "Product Types")
    + etc
    

    在我的场景中,产品列表包含生产Sharepoint平台上的生产数据。它由业务用户填充数据。 但是,产品类型列表包含相当静态的数据,由开发人员维护。

    现在经过一个开发周期,开发人员希望部署他的新Web部件和新数据(产品类型列表)。开发人员执行以下程序:

    1. 在生产机器上:删除“产品类型”列表中的所有项目
    2. 在生产机器上:使用stsadm导入“产品类型”列表

    这意味着我们基本上替换了生产服务器上的“产品类型”列表,同时保持“产品”列表的原样。

    现在的问题是:

    • 这安全吗?查找引用在某些情况下会中断吗?
    • 如果有人在导入过程中访问“产品”,会发生什么情况?引用(现在无效)是否会清除它自己的内容(成为空值)。
    • 如果“产品类型”列表的模式更改(新列),会发生什么情况?这会引起什么麻烦吗?

    感谢所有的反馈和建议!

    更新1 导入的“产品类型”项与以前删除的项具有相同的ID。

    更新2

    2 回复  |  直到 16 年前
        1
  •  2
  •   Punit Vora    16 年前

    我们以前也遇到过同样的情况。这有点棘手,取决于你将如何处理它。

    1) 通过UI删除并重新创建产品类型列表

    2) 通过功能删除并重新创建产品类型

    如果你 有 feature.xml 使用 <ListInstance> 元素,则如果删除该列表,然后使用相同的功能重新创建它(基本上ListInstance的Id属性保持不变,列表项的数量,即 <Row> 元素,可能会改变),关联将保持不变。因此,如果您要再添加5种产品类型,那么如果您使用某个功能创建了列表,您可以删除该列表,并使用相同的功能为新项目提供额外的信息,这样一切都会正常工作!

    作为补充说明,这是一种更好的方法,因为如果您必须在许多服务器上进行升级,那么与通过stsadm进行列表导出导入相比,功能停用和激活是一种更推荐的解决方案。我们就是这样做的。

    3) 从产品类型中删除所有列表项并添加新项(列表从不删除)

    如果要将查找字段(在产品列表中)链接到查找列表(产品类型)的ID字段,则必须 请记住,ID是自动递增的,所以如果删除所有项,然后添加新项,则它们的ID将不同 . 假设列表中有5个ID为1-5的项目(在数据表视图中编辑时,ID字段不显示在UI中)。如果删除它们并添加新项目,它们的ID将从6开始,而不是1。因此,如果查找字段中有指向ID为1的项的链接,则此方法将不起作用,因为产品类型列表中不再有ID为1的项。因此,在使用此方法进行生产之前,您可能需要真正尝试一下。

    我主要谈论的是在列表中添加新项目。现在,如果您正在删除现有的项,那么您的查找字段将受到影响,因为假设您按ID链接了字段,那么该ID将不再存在,因为该项已被删除。基本上,任何你使用的方法,保持你的ID是至关重要的。

    对于列表的stsadm export-import(我自己从来没有做过),我不太确定,但是stsadm可能很棘手,因为有些操作只能在某些范围内工作。所以你最好在dev env上试一下你的场景。

    导入过程中发生的事情也很棘手,这取决于具体的时间安排。我确信SP有自己的并发机制,但是您不能得到一个明确的答案,因为它可能会根据导入的阶段而有所不同。如果可能,建议的方法是在计划停机期间进行导入。

    关于更改列表的模式,列表模式的更改不会影响现有列表实例(大部分情况下)。如果您是通过UI来完成的,我相信SP会直接对contentdb进行更改。我不确定您打算如何执行此操作,但是如果您要使用功能将列添加到现有列表中,则执行此操作的方法是在功能激活期间,向列表中添加新内容类型,然后将新列添加到此内容类型中。这样可以添加列,但不会影响现有列表项。

    祝你好运。。。

        2
  •  1
  •   Grace Note    16 年前

    • 查找将中断的主要原因发生在字段范围上:它引用的列表不再存在,或者列表不包含必需的字段。如果删除并重新创建列表,通常会发生这种情况,但您没有这样做。如果确实中断了查找的列表引用,那么唯一可以做的就是重新创建查找,因为一旦创建了查找字段,就无法为其配置列表引用。
    • 导入/导出过程的缺点是会丢失当前所有现有查找值的有效性。查找根据其引用的项的ID保持其完整性。因此,当显示字段更改时,它仍然引用同一项。如果删除该项,则查找将不再引用该项,即使您为“显示”字段创建了具有相同值的新项也是如此。因此,您必须将所有产品重新分配给新的产品类型。
      • 应该注意的是,如果您要恢复对该项的删除,它将返回到查找中!对该ID的引用将一直保留,直到实际的查找值被更新(例如通过编辑产品)。
    • 为了交互的目的,所有现在无效的引用都将为null。在显示窗体上看不到任何内容,并且在尝试更新产品时也没有选项。当您更新产品时,您将其更新为您刚刚设置的内容,因为您无法设置不存在的id,这意味着不再有对这些id的引用。