SPMetal 默认代码生成规则
上次修改时间: 2015年3月9日
适用范围: SharePoint Foundation 2010
本文内容
表示网站的类
表示列表的属性
表示内容类型的类
表示列表栏的属性
表示单选或多选字段的选项的枚举和类
表示查阅列表关系的 EntityRef<T>、EntitySet<T> 和 LookupList<T> 字段
本主题指定 SPMetal 在生成代码时遵循的默认规则。您可以通过创建 SPMetal 参数文件并向 SPMetal 命令行添加 /parameters 选项来更改此行为的一部分。有关这种类型的自定义操作的详细信息,请参阅 用参数 XML 文件替代 SPMetal 默认值 和 SPMetal。
在以下各节中,无法替代用星号 (*) 标记的规则。
可以 替代的任何规则的后面都有替代它的 XML 标记指示。
表示网站的类
*生成一个继承自 DataContext 类的类,以在整体上表示网站数据。
*该类标记为 partial(在 Microsoft Visual Basic 中为 Partial)。
该类标记为 public(在 Visual Basic 中为 Public)。(使用 <Web> 元素的 AccessModifier 属性替代。)
该类命名为 FileNameDataContext,其中 FileName 为由 SPMetal 命令行上的 /code 选项指定的文件名称(不包括文件扩展名)。例如,如果命令行上存在"/code:Personnel.vb",则该类命名为 PersonnelDataContext。(使用 <Web> 元素的 Class 属性替代。)
表示列表的属性
在网站中为每个非隐藏列表生成一个属性(在从 DataContext 派生的类中)。(使用 <ExcludeList> 或 <ExcludeOtherLists> 元素替代。)
*该属性的类型为 EntityList<TEntity>。
*该属性标记为 public(在 Visual Basic 中为 Public)。
不会为隐藏列表生成任何属性。(使用其 Name 属性已分配给隐藏列表的 <IncludeHiddenLists> 元素或 <List> 元素替代。)
表示列表的属性与列表具有相同的名称,但以下情况例外。
如果列表名称中包含空格,则从属性名称中删除这些空格。
如果列表名称的第一个字母是小写,则在属性名称中将其大写。
列表名称
属性名称
Announcements
Announcements
Team Members
TeamMembers
lentils
Lentils
(使用 <List> 元素的 Member 属性替代。)
EntityList<TEntity> 属性的类型参数 TEntity 是为列表生成的内容类型类。请参阅本主题下面的表示内容类型的类。通常,如果有多个与列表相关联的内容类型,则 TEntity 是一个公约数内容类型。通常公约数类只是 Microsoft SharePoint Foundation 的基本 Item 内容类型。(使用 <List> 元素的 Type 属性替代。)
重要信息 常规规则的一个例外情况是,当列表具有多个内容类型时,将使用公约数内容类型。SharePoint Foundation 还将一个基本 Folder 内容类型添加到所有列表中(除了基本 Item 内容类型外)。但在默认情况下,SPMetal 在确定列表是否包含多个内容类型时不会将 Folder 内容类型考虑在内。因此,如果 Folder 内容类型是唯一的其他内容类型,则 EntityList<TEntity> 属性的 TEntity 是列表的完全特定内容类型,例如 Announcements 列表的 Announcement 以及 Calendar 列表的 CalendarEvent。您可以替代此默认行为。
表示内容类型的类
生成一个内容类型类以表示基本的 SharePoint Foundation Item 内容类型。(使用适用于该内容类型和从其继承的每个内容类型类的 <ExcludeContentType> 元素替代。)
对于任何列表(尚未从代码生成中排除),会为分配给该列表的每个定义的内容类型生成一个内容类型类。(使用 <ExcludeContentType> 或 <ExcludeOtherContentTypes> 元素替代。)
对于任何定义的内容类型(包括基本的 Item 内容类型),生成的类与该内容类型具有相同的名称。(使用 <ContentType> 元素的 Class 属性替代。)
*对于不使用定义的内容类型的任何列表(尚未从代码生成中排除该列表,但已为其添加一个或多个栏),将生成一个类来表示隐含的内容类型。
表示隐含内容类型的类将命名为 ProcessedListNameBaseContentType,其中 ProcessedListName 是为表示列表的属性生成的同一名称(请参阅本主题前面的表示列表的属性 )。BaseContentType 是从中派生隐含内容类型的定义的内容类型名称。这通常为 Item,但在有些情况下为其他某个定义的内容类型的名称。例如,如果将定义的内容类型 Issue 添加到一个名为 Tasks 的列表中,然后从该列表中删除该内容类型的一个栏,则表示这个新隐含的内容类型的类名为 TasksIssue。(使用 <ContentType> 元素的 Class 属性替代。)
重要信息 在读取 parameter.xml 文件时隐含的内容类型尚未命名,因此您无法将"ProcessedListNameBaseContentType"用作 parameters.xml 文件中任何元素的任何属性值。例如,您无法通过以下方法获取 SPMetal 以将表示"小组成员"列表的 EntityList<TEntity><T> 属性定义为 EntityList<TeamMembersItem>(其中 TeamMembersList 是列表的隐含内容类型):为列表创建一个 <List> 元素并将其 Type 参数设置为"TeamMembersItem"。这会从 SPMetal 产生错误,因为它在读取参数 XML 文件时尚未生成名称"TeamMembersItem"。如果您需要将列表的成员视为隐含类型的对象,可以在调用 GetList<T>(String) 时使用 Cast<TResult>(IQueryable) 方法,并让其返回匿名类型。例如,var teamMembers = teamWebSite.GetList<Item>("TeamMembers").Cast<TeamMembersItem>();。
*如果某个内容类型继承自另一个内容类型,则表示前者的生成的类继承自表示后者的类。
*该内容类型类标记为 partial(在 Visual Basic 中为 Partial)。
这些内容类型类标记为 public(在 Visual Basic 中为 Public)。(使用<ContentType> 元素的 AccessModifier 属性替代。)
不会为隐藏的内容类型生成任何类。(使用其 Name 属性已分配给隐藏的内容类型的 <IncludeHiddenContentTypes> 元素或 <ContentType> 元素替代。)
*表示基本的 Item 内容类型的类可实现 ITrackEntityState、ITrackOriginalValues、INotifyPropertyChanged 和 INotifyPropertyChanging。
表示列表栏的属性
为内容类型中的每个非隐藏字段(栏)生成一个属性(在内容类型类中)。(使用 <ExcludeColumn> 或 <ExcludeOtherColumns> 元素替代。)
*该属性标记为 public(在 Visual Basic 中为 Public)。
该属性与其表示的栏具有相同的名称。(使用 <Column> 元素的 Member 属性替代。)
*将删除栏名称中的空格。
*如果栏名称中的第一个单词为小写,则在属性名称中使用大写。
栏属性的类型由符合 类型映射:从 LINQ to SharePoint 提供程序映射到 .NET中所显示的映射的字段属性来确定。(使用 <Column> 元素的 Type 属性替代。)
不会为在列表上而不在内容类型中的栏生成任何属性。(使用 <Column> 元素的 Name 属性替代。)
不会为隐藏栏生成任何属性,但"Id"和"Version"栏除外。(使用 <IncludeHiddenColumns> 元素替代。)
表示单选或多选字段的选项的枚举和类
对于每个不 允许"填充"选项的单选字段,将生成一个枚举类。(使用 <Column> 元素的 Type 属性替代。)
对于每个不 允许"填充"选项和具有的选项少于 31 个的多选字段,将生成一个使用 [Flags] 属性修饰 的枚举类。(使用 <Column> 元素的 Type 属性替代。)
*"Invalid"和"None"作为可能值添加到 1 和 2 中的枚举。
*对于每个不 允许"填充"选项的单选或多选字段,将为每个定义的值生成一个带有 String 常量的密封类。
表示查阅列表关系的 EntityRef<T>、EntitySet<T> 和 LookupList<T> 字段
*对于每个用于查找另一个列表中的某一字段并且不允许 多个值的栏,表示该栏的属性会包装一个 EntityRef<TEntity> 类型的私有字段,其中 TEntity 是查阅列表的内容类型。
*对于每个用于查找另一个列表中的某一字段并且允许 多个值的栏,如果该栏要查找由 SPMetal 生成的代码表示的列表,则表示该列的属性会包装一个 EntitySet<TEntity> 类型的私有字段,其中 TEntity 是查找列表的内容类型。
* 对于每个用于查找另一个列表中的某一字段并且不允许 多个值的栏,如果该栏要查找不是 由 SPMetal 生成的代码表示的列表(例如,SPMetal 的配置文件已在代码生成中隐藏或排除的目标列表),则会生成两个私有 LookupList<T>。其中一个字段保存查阅字段(其为目标列的一部分)的当前值,另一个字段保存从中获取当前值的列表项 ID。这两个私有字段都用 IList<T> 类型的公共属性包装起来。
请参阅
引用
Microsoft.SharePoint.Linq.CodeGeneration