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.Webproject and select "Open in Terminal."
Ensure that you are in the
dotnet sergen gto launch the Sergen code generation user interface.
If you encounter an error, type
dotnet tool restorebefore running Sergen, and ensure you are inside the
Sergen will list the connections found in the
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
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.
Module names should be in Pascal case, starting with a capital letter. Invalid module names include
aModule. A valid module name is
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.
The identifier must always be in Pascal case, starting with a CAPITAL letter. Invalid identifier names include
aTable. A valid identifier name is
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
adminand the password
serenityto 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.