实体(Row) - FieldFlags 枚举

优质
小牛编辑
130浏览
2023-12-01

[命名空间: Serenity.Data.Mapping] - [程序集: Serenity.Data]

Serenity 有一组字段标识控制字段行为。

  1. public enum FieldFlags
  2. {
  3. None = 0,
  4. Insertable = 1,
  5. Updatable = 2,
  6. NotNull = 4,
  7. PrimaryKey = 8,
  8. AutoIncrement = 16,
  9. Foreign = 32,
  10. Calculated = 64,
  11. Reflective = 128,
  12. ClientSide = 256,
  13. Trim = 512,
  14. TrimToEmpty = 512 + 1024,
  15. DenyFiltering = 2048,
  16. Unique = 4096,
  17. Default = Insertable | Updatable | Trim,
  18. Required = Default | NotNull,
  19. Identity = PrimaryKey | AutoIncrement | NotNull
  20. }

普通表字段有 InsertableUpdatableTrim 默认设置,对应于 Default 组合标识。

Insertable 标识

Insertable 标识控制字段在新增记录状态下是否可编辑。默认情况下,所有普通字段都被认为是可插入的。

某些字段可能不是在数据库表中插入的,如,标识(identity) 列不应该有该标识设置。

当字段没有该标识,在新增记录状态的表单下不能编辑该字段。在服务端的仓库层同样有效。

有时候,内部字段可能在 SQL INSERT 声明中完全有效,但不应该在表单中编辑。一个例子是 InsertedByUserId 应在服务层面上设置,而不是由终端用户设置。如果我们让终端用户可以在表单中编辑它,这将是一个安全漏洞。此类字段也不应该具有 Insertable 标识设置。

这意味着字段标识不需要与数据库表的设置相匹配。

Insertable 特性

要取消字段的 Insertable 标识,可以使用 [Insertable(false)] 特性:

  1. [Insertable(false)]
  2. public string MyField
  3. {
  4. get { return Fields.MyField[this];
  5. set { Fields.MyField[this] = value;
  6. }

使用 Insertable(true) 启用标识符功能。

非可插入字段在表单中是不隐藏的。它们只是处于只读状态。如果你想隐藏它们,请使用 [HideOnInsert] 特性 (Serenity 1.9.8+) ,或者使用 form.MyField.GetGridField().Toggle(IsNew) 重写对话框中 UpdateInterface 方法。

Updatable 标识

该标识就像 Insertable 标识,但是控制表单记录的编辑状态和服务端的更新操作。默认情况下,所有普通字段都被认为是可更新的。

Updatable 特性

要取消字段的 Updatable 标识,可以使用 [Updatable(false)] 特性:

  1. [Updatable(false)]
  2. public string MyField
  3. {
  4. get { return Fields.MyField[this];
  5. set { Fields.MyField[this] = value;
  6. }

使用 Updatable(true) 启用标识符功能。

非可插入字段在表单中是不隐藏的。它们只是处于只读状态。如果你想隐藏它们,请使用 [HideOnInsert] 特性 (Serenity 1.9.8+) ,或者使用 form.MyField.GetGridField().Toggle(IsNew) 重写对话框中 UpdateInterface 方法。

Trim 标识

该标识只对字符串类型的字段有效,它控制着值在保存之前是否被修剪。所有字符串默认包含该标识。

当字段值是空字符串或全是空格,它将被修剪为 null 。

TrimToEmpty 标识

如果你更喜欢把字符串字段修剪为空的字符串,而不是 null,则使用此标识。

当字段值是 null 或全是空格,它将被修剪为空字符串。

SetFieldFlags 特性

此属性可用于在字段中包含或排除一组标识。第一个参数是必需的,表示包含的标识;第二个是可选参数,表示排除的标识。

要启用字段中的 TrimToEmpty 标识,我们可以这样使用:

  1. [SetFieldFlags(FieldFlags.TrimToEmpty)]
  2. public string MyField
  3. {
  4. get { return Fields.MyField[this];
  5. set { Fields.MyField[this] = value;
  6. }

要取消 Trim 标识,则:

  1. [SetFieldFlags(FieldFlags.None, FieldFlags.TrimToEmpty)]
  2. public string MyField
  3. {
  4. get { return Fields.MyField[this];
  5. set { Fields.MyField[this] = value;
  6. }

要包含 TrimToEmpty 和 Updatable ,并移除 Insertable,则:

  1. [SetFieldFlags(
  2. FieldFlags.Updatable | FieldFlags.TrimToEmpty,
  3. FieldFlags.Insertable)]
  4. public string MyField
  5. {
  6. get { return Fields.MyField[this];
  7. set { Fields.MyField[this] = value;
  8. }

Insertable 和 Updatable 特性是 SetFieldFlags 特性的子类。

NotNull 标识

使用该标识设置字段为不可空。默认情况下,该标识使用 NotNull 特性设置字段在数据库为不可空字段。

当字段是不可空的,它在表单对应的标签中有一个红色的星号,并要求必须输入值。

NotNullable 特性

在字段中使用 NotNull 特性启用非空限制,移除该特性表示取消该限制。

即使字段在数据库中不是可空的,也可以使用 [Required(false)] 让字段在表单中变为非必填字段。它不会清除 NotNull 标识。

Required 标识

这是 Default 和 NotNullable 标识的组合。

它与表单中控制验证的 [Required] 特性没有关系。

PrimaryKey 标识和 PrimaryKey 特性

为表中的主键字段设置该标识。

列表和检索请求处理程序的 Key 列选择模式选择主键字段。

使用 [PrimaryKey] 特性启用该标识。

AutoIncrement 标识和 AutoIncrement 特性

设置此字段在服务器端是自动递增,例如,标识列或使用生成器(generator)的列。

Identity 标识和 Identity 特性

这是 PrimaryKey、AutoIncrement 和 NotNull 标识的组合,常用于标识列。

Foreign 标识

该标识设置通过联接其他表得到的外来视图字段。

它自动为字段设置表达式,该表达式包含 T0 以外的表别名。

例如,如果一个字段有像 [Expression(“jCountry.CountryName”)] 这样的特性,它将有此标识。

该标识与 ForeignKey 特性没有关系。

Calculated 标识

如果字段的表达式有涉及多个字段或一些数学运算,它将有此标识。

也可以为在 SQL 服务器端计算的字段设置此标识。

ClientSide 标识和 ClientSide 特性

对应于 Serenity 实体未映射的字段。它们没有在数据库表中对应的字段。

这些类型的字段可以用于临时计算、存储及客户端和服务层上的传输。

Reflective 标识

是用于未映射字段的一种高级形式,这些字段没有存储在行中,但反映了另一个不同形式的字段值。例如,绝对值显示为整数的字段也可以是负整数。

应该只在极少数情况下,对这类未映射的字段使用该标识。

DenyFiltering 标识

如果设置该标识,则表示拒绝对敏感字段进行过滤操作。对于像 PasswordHash 这样的机密字段很有用,不应该允许由客户端选择或过滤这些机密字段。

Unique 标识和 Unique 特性

当字段有该标识,在数据库中与现有值进行检查以确保其值必须是唯一的。

你可以使用 Unique 特性启用该标识,并确定是否应在服务级别检查此约束(在数据库级别检查以避免出现神秘约束的错误)。