1

我有一个关于导入数据时查找字段行为的问题。我想知道当它们指向的列表被替换/导入时查找字段的行为如何。为了解释这个问题,我将在下面提供一个简单的示例:

例如,假设我们有这两个共享点列表:

Product Types
-------------
+ Type Name
+ Code Nr
+ etc


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

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

现在,在一个开发周期之后,开发人员想要部署他的新 webpart 和他的新数据(产品类型列表)。开发人员执行以下过程:

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

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

现在的问题:

  • 这安全吗?查找引用会在某些情况下中断吗?
  • 此导入/导出程序有什么缺点吗?
  • 如果有人在导入过程中访问“产品”会怎样?(现在无效的)引用是否会清除它自己的内容(成为空值)。
  • 如果“产品类型”列表的架构发生变化(新列)会发生什么?这会带来什么麻烦吗?

感谢所有反馈和建议!

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

更新 2 开始赏金以获得更多反馈/意见。

4

2 回答 2

2

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

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

如果您通过 UI 删除并重新创建查找列表(在您的情况下为产品类型),那么您将失去连接,因为列表的 id GUID 将在重新创建时更改。所以不要走那条路。

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

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

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

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

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

4)就地编辑列表

如果列表不是特别大,并且您只需对一两个实例进行此更改,您是否可以直接在产品服务器的数据表视图中编辑列表?在数据表视图中编辑时,不要删除项目,而只是覆盖其列的值。如果需要,您可以添加更多项目。这将确保您的身份证件有效。

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

现在关于您的疑问/问题:我不太确定列表的 stsadm 导出导入(我自己从未做过),但 stsadm 可能会很棘手,因为某些操作仅适用于某些范围。因此,您最好在开发环境中尝试您的确切方案。

导入期间发生的事情又很棘手,具体取决于确切的时间。我确信 SP 有自己的并发机制,但你不能有一个明确的答案,因为它可能会根据导入的阶段而有所不同。如果可能,推荐的方法是在计划的停机时间内进行导入。

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

祝你好运...

于 2010-04-26T21:55:04.020 回答
1

There are two components to a particular lookup: the field, and the field value. The field value only contains the ID of the item(s) it refers to, and the display field. This information is meaningless without the field, which specifies what list to look at and what field to use as the display field.

  • The primary reason that a Lookup will break occurs on the field scope: either the list it referred to no longer exists, or the list does not contain the required field. These would generally happen if you deleted and recreated the list, but you aren't doing that. If you do break a lookup's list reference, then the only thing you can do is re-create the lookup, because you cannot configure the list reference for a lookup field once it is created.
  • The downside of your import/export procedure is that you lose the validity of all currently existing lookup values. A lookup maintains its integrity based on the ID of the item it references. So when the display field changes, it still refers to the same item. If you delete the item, then the lookup no longer references it, even if you create a new item that has the same value for the display field. So you would have to reassign all of the products to the new product types.
    • It should be noted that if you were to revert the deletion of that item, it would return to being on the lookup! The reference to that ID is kept until the actual lookup value is updated (such as by editing the Product).
  • All of your now invalid references will be null for purposes of interaction. You won't see anything on display forms, and you won't have the options when you try to update the product. When you do update the product, you update it to what you just set it to, which since you can't set the non-existent IDs, means that there are no more references to those IDs.
  • Any changes to the Product Type list's schema that do not affect the display field specified for the lookup will not have any effect on the lookup integrity. If you do change the display field in any fashion, and of course if you delete it, then it will break in the same fashion as with the list reference. However, you can set the display field, both in the UI and in the object model, so it is easy to fix this.
于 2010-04-21T19:19:12.923 回答