Generating Code for Movie Table
Using the Serenity Code Generator
After confirming the existence of the Movie
table in the database, you can employ the Serenity Code Generator (dotnet sergen
) to create the initial editing interface.
Since ASP.NET Core offers cross-platform support, the .NET Core version of Sergen can run on macOS, Linux, and Windows. Presently, it has a console-based user interface.
Right-click on the
MovieTutorial.Web
project and select "Open in Terminal."Ensure that you are in the
MovieTutorial.Web
directory.Enter
dotnet sergen g
to launch the Sergen code generation user interface.
If you encounter an error, type
dotnet restore
anddotnet tool restore
before running Sergen, and ensure you are inside theMovieTutorial.Web
directory.
Sergen will list the connections found in the appsettings.json
file.
You can navigate through the connections using the up and down arrow keys. Select the Default
connection and press Enter.
After pressing Enter, you'll receive a list of tables in that database:
Navigate through the list and select the dbo.Movie
table by pressing Space. Then, press Enter to confirm your selection.
Next, Sergen will prompt you to enter a module name. Please type in MovieDB
.
In Serenity terms, a module is a logical group of pages that share a common purpose. For instance, in the Serene template, all pages related to the Northwind sample are part of the Northwind module. Pages related to the general management of the site, such as users and roles, belong to the Administration module. Typically, a module corresponds to a database schema or a single database, but you can use multiple modules within a single database/schema or have multiple databases in one module.
For this tutorial, we will use MovieDB, similar to IMDB, for all pages.
The module name determines the namespace and URL of the generated pages. For example, our new page will be under the MovieTutorial.MovieDB namespace and will use a /MovieDB relative URL.
Please Note!
Module names should be in Pascal case, starting with a capital letter. Invalid module names include
myModule
,mycoolmodule
, andaModule
. A valid module name isMyCoolModule
.
When prompted, please enter Movie
as the class identifier.
The class identifier typically corresponds to the table name. However, in some cases, table names might contain underscores or other invalid characters. In such situations, you have the flexibility to choose an appropriate name for your entity in the generated code, as long as it's a valid C# identifier.
Since our table name is Movie, which is a valid and appropriate C# identifier, let's use Movie as the entity identifier. Our entity class will be named MovieRow.
This name also influences other class names. For instance, our page controller will be named MoviePage. It also determines the page URL; in this sample, our editing page will be located at the URL /MovieDB/Movie.
Please Note!
The identifier must always be in Pascal case, starting with a CAPITAL letter. Invalid identifier names include myTable
, mycoolTable
, and aTable
. A valid identifier name is MyCoolTable
.
Leave the permission as Administration:General
and press Enter again.
In Serenity, access control to resources (pages, services, etc.) is managed using permission keys, which are simple strings. Users or roles are granted these permissions.
For our Movie page, it will be used exclusively by administrative users (or perhaps content moderators in the future). Therefore, let's set the permission to Administration:General
for now. In the Serene template, by default, only the admin
user has this permission.
Next, Sergen will ask you which files to generate. By default, the All option is preselected, which includes Row, Repository & Service, User Interface, and Custom. Press ENTER one last time.
If you don't need a UI for a particular entity, you can choose Row and Services only. If you only want an entity class and not request handlers or service access, select only Row.
You can now exit the command prompt and return to Visual Studio to continue your work.
After Generating Code
REBUILD the Solution to ensure all changes are applied correctly.
Press F5 to launch the application.
Use the username
admin
and the passwordserenity
to log in.Once you're on the Dashboard page, you will notice a new section,
MovieDB
, at the bottom of the navigation sidebar.Click to expand it and select Movie to open our first generated page.
Now, try adding a new movie, and then attempt to update and delete it.
Sergen generated code for our table, and it works seamlessly without us needing to write a single line of code.
However, it's essential to note that Serenity is not a no-code or low-code platform for non-developers who avoid writing code entirely. The key point here is maintainability. The code produced by some designers and code generators is often an unmanageable mess that developers are discouraged from touching.
Sergen has been invaluable for our initial setup, which is crucial for a layered architecture and adhering to platform standards. Without Sergen, we would need to create approximately 13 files for the entity, request handlers, page, endpoint, grid, form, and more. We would also need to set up configurations in a few other places.
Even if we copied and pasted code from another page, it could be error-prone and take about 5-10 minutes.
The code files generated by Sergen contain the essential code with a focus on efficiency. This is made possible by the base classes in Serenity that handle most of the logic. Once we generate code for a table, we're unlikely to use Sergen again for that table. Instead, we'll modify the generated code to meet our specific requirements. We'll explore how to do that.