创建检索表

让我们从创建系统所要用到的检索表开始。

这是所需的表:

  • 会议类型表(董事会会议、每周分析、SCRUM 会议、年会等);
  • 地点表(举行会议的地址、房间号码等);
  • 议程类型表(会议的主题,一个可能有多个主题);
  • 单位表(此次会议的组织单位);
  • 联系人表(参会人员、记者、管理层等)。

我们使用 met 作为数据库表的 schema 。

Modules/Common/Migrations/DefaultDB 创建一个名为 DefaultDB_20160709_232400_MeetingLookups 的迁移类:

  1. using FluentMigrator;
  2. namespace MeetingManagement.Migrations.DefaultDB
  3. {
  4. [Migration(20160709232400)]
  5. public class DefaultDB_20160709_232400_MeetingLookups
  6. : AutoReversingMigration
  7. {
  8. public override void Up()
  9. {
  10. Create.Schema("met");
  11. Create.Table("AgendaTypes").InSchema("met")
  12. .WithColumn("AgendaTypeId").AsInt32()
  13. .Identity().PrimaryKey().NotNullable()
  14. .WithColumn("Name").AsString(100).NotNullable();
  15. Create.Table("Contacts").InSchema("met")
  16. .WithColumn("ContactId").AsInt32()
  17. .Identity().PrimaryKey().NotNullable()
  18. .WithColumn("Title").AsString(30).Nullable()
  19. .WithColumn("FirstName").AsString(50).NotNullable()
  20. .WithColumn("LastName").AsString(50).NotNullable()
  21. .WithColumn("Email").AsString(100).NotNullable();
  22. Create.Table("Locations").InSchema("met")
  23. .WithColumn("LocationId").AsInt32()
  24. .Identity().PrimaryKey().NotNullable()
  25. .WithColumn("Name").AsString(100).NotNullable()
  26. .WithColumn("Address").AsString(300).Nullable()
  27. .WithColumn("Latitude").AsDouble()
  28. .WithColumn("Longitude").AsDouble();
  29. Create.Table("MeetingTypes").InSchema("met")
  30. .WithColumn("MeetingTypeId").AsInt32()
  31. .Identity().PrimaryKey().NotNullable()
  32. .WithColumn("Name").AsString(100).NotNullable();
  33. Create.Table("Units").InSchema("met")
  34. .WithColumn("UnitId").AsInt32()
  35. .Identity().PrimaryKey().NotNullable()
  36. .WithColumn("Name").AsString(100).NotNullable();
  37. }
  38. }
  39. }

为检索表生成代码

我们的模块名称为 Meetings。在生成代码时,我们应该使用非复数的实体标识符:

  • AgendaTypes => AgendaType
  • Contacts => Contact
  • Locations => Location
  • MeetingTypes => MeetingType
  • Units => Unit

为这 5 张表使用上面给出的实体标识符生成代码:

Sergen Lookups

对这些表生成的界面并不是很美观,需要做一些美化。

Initial Lookups

把导航连接移到 NavigationItems.cs

打开 AgendaTypePage.csContactPage.csLocationPage.csMeetingTypePage.csUnitPage.cs 文件,并把文件顶部的导航连接移至 NavigationItems.cs

  1. using Serenity.Navigation;
  2. using Administration = MeetingManagement.Administration.Pages;
  3. using Meeting = MeetingManagement.Meeting.Pages;
  4. [assembly: NavigationLink(1000, "Dashboard",
  5. url: "~/", permission: "", icon: "icon-speedometer")]
  6. [assembly: NavigationMenu(2000, "Meeting")]
  7. [assembly: NavigationLink(2500, "Meeting/Agenda Types",
  8. typeof(Meeting.AgendaTypeController))]
  9. [assembly: NavigationLink(2600, "Meeting/Contacts",
  10. typeof(Meeting.ContactController))]
  11. [assembly: NavigationLink(2700, "Meeting/Locations",
  12. typeof(Meeting.LocationController))]
  13. [assembly: NavigationLink(2800, "Meeting/Meeting Types",
  14. typeof(Meeting.MeetingTypeController))]
  15. [assembly: NavigationLink(2900, "Meeting/Units",
  16. typeof(Meeting.UnitController))]

为检索表设置 DisplayName 和 InstanceName 特性

打开 AgendaTypeRow.csContactRow.csLocationRow.csMeetingTypeRow.csUnitRow.cs 文件,并像下面那样修改 DisplayNameInstanceName 特性:

  • AgendaTypeRow => “Agenda Types”, “Agenda Type”
  • ContactRow => “Contacts”, “Contact”
  • LocationRow => “Locations”, “Location”
  • MeetingTypeRow => “Meeting Types”, “Meeting Type”
  • UnitRow => “Units”, “Unit”
  1. [ConnectionKey("Default"), TwoLevelCached,
  2. DisplayName("Agenda Types"), InstanceName("Agenda Type")]
  3. [ReadPermission("Meeting")]
  4. [ModifyPermission("Meeting")]
  5. public sealed class AgendaTypeRow : Row, IIdRow, INameRow
  6. {