Movie 网站 (类似于IMDB) - 添加一个影片类型字段

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

如果我们还想在影片表中保存电视剧和微电影,那我们就需要另一个字段(MovieKind)来存储它。

我们在创建影片(Movie)表时并没有添加 MovieKind 字段,现在我们用另一个迁移类把它添加到数据库中。

不要修改现有的迁移类,因为现有的迁移类不会再次运行。

Modules/Common/Migrations/DefaultDB/ DefaultDB_20160519_145500_MovieKind.cs 下面创建另一个迁移文件:

  1. using FluentMigrator;
  2. namespace MovieTutorial.Migrations.DefaultDB
  3. {
  4. [Migration(20160519145500)]
  5. public class DefaultDB_20160519_145500_MovieKind : Migration
  6. {
  7. public override void Up()
  8. {
  9. Alter.Table("Movie").InSchema("mov")
  10. .AddColumn("Kind").AsInt32().NotNullable()
  11. .WithDefaultValue(1);
  12. }
  13. public override void Down()
  14. {
  15. }
  16. }
  17. }

定义一个影片类型枚举

现在我们把 Kind 字段添加到影片(Movie)表中,我们需要一些影片类型作为值。让我们将它定义在 MovieTutorial.Web/Modules/MovieDB/Movie/MovieKind.cs 的枚举中:

  1. using Serenity.ComponentModel;
  2. using System.ComponentModel;
  3. namespace MovieTutorial.MovieDB
  4. {
  5. [EnumKey("MovieDB.MovieKind")]
  6. public enum MovieKind
  7. {
  8. [Description("Film")]
  9. Film = 1,
  10. [Description("TV Series")]
  11. TvSeries = 2,
  12. [Description("Mini Series")]
  13. MiniSeries = 3
  14. }
  15. }

在 MovieRow 实体中添加 类型(Kind)字段

因为我们没有使用 Sergen ,所以我们需要在 MovieRow.cs 手工添加一个映射类型(Kind)属性。在 MovieRow.cs 的 Runtime 属性下面添加:

  1. [DisplayName("Runtime (mins)")]
  2. public Int32? Runtime
  3. {
  4. get { return Fields.Runtime[this]; }
  5. set { Fields.Runtime[this] = value; }
  6. }
  7. [DisplayName("Kind"), NotNull]
  8. public MovieKind? Kind
  9. {
  10. get { return (MovieKind?)Fields.Kind[this]; }
  11. set { Fields.Kind[this] = (Int32?)value; }
  12. }

我们还需要声明一个 Int32Field 对象,该对象用于 Serenity 实体系统。在 MovieRow.cs 的底部找到 RowFields 类并在 Runtime 字段后添加 Kind 字段:

  1. public class RowFields : RowFieldsBase
  2. {
  3. // ...
  4. public readonly Int32Field Runtime;
  5. public readonly Int32Field Kind;
  6. public RowFields()
  7. : base("[mov].Movie")
  8. {
  9. LocalTextPrefix = "MovieDB.Movie";
  10. }
  11. }

为影片表单添加影片类型

如果我们现在生成并运行项目,尽管我们已经在 MovieRow 添加了 Kind 字段的映射,但在影片表单中还是看不到任何的变化。这是由于表单中字段的显示/编辑是在 MovieForm.cs 中控制的。

于是我们对 MovieForm.cs 做如下修改:

  1. namespace MovieTutorial.MovieDB.Forms
  2. {
  3. // ...
  4. [FormScript("MovieDB.Movie")]
  5. [BasedOnRow(typeof(Entities.MovieRow))]
  6. public class MovieForm
  7. {
  8. // ...
  9. public MovieKind Kind { get; set; }
  10. public Int32 Runtime { get; set; }
  11. }
  12. }

现在,生成并运行应用程序。当你尝试编辑或添加影片时,什么也不会发生。这是一个预料之中的情况。如果你打开浏览器的开发者工具(F12),在控制台中将出现一个错误:

  1. Uncaught Can't find MovieTutorial.MovieDB.MovieKind enum type!

每当发生这样的事,请先检查浏览器控制台报告的错误信息。

这个错误是由于 MoveKind 枚举在客户端无效而导致的,因此,在这种情况下,我们应该在运行程序之前运行我们的 T4 模板。

现在在 Visual Studio 中再次点击 生成 -> 转换所有模板。

重新生成解决方案并运行它。现在就可以在表单中使用下拉列表选择影片类型了。

Movie Kind Selection

为影片类型定义一个默认值

Kind 是一个必填字段,我们必须在 新增 Movie 对话框中填写该字段,否则将得到一个验证错误。

但是我们大部分影片都是故事片,所以应该把该值设为默认值。

若要为 Kind 属性添加默认值,需要像这样添加 DefaultValue 特性:

  1. [DisplayName("Kind"), NotNull, DefaultValue(MovieKind.Film)]
  2. public MovieKind? Kind
  3. {
  4. get { return (MovieKind?)Fields.Kind[this]; }
  5. set { Fields.Kind[this] = (Int32?)value; }
  6. }

现在,在新增 Movie 对话框中,Kind 字段的值将预设为 Film