One of the most painful omissions from the Entity Framework V1 was Model First, which basically means creating a conceptual 'model first' and then deriving a storage model, database and mappings from that.
People ask for this scenario all the time in the forums.
Well Noam, a Program Manager on the Entity Framework Tools team, outlines what we are considering:
Generating Databases from Models
The next release of the Entity Framework will include the ability to generate database schemas from your model. The main entry point into this feature is via the Designer context menu, to which we will add a new option called “Create Database from Model”.
(Note: User interface elements in this walkthrough are not final user interfaces, as the design is still under review, so please provide feedback...)
Selecting this option will bring up the following warning:
We would like users to understand that this feature will regenerate all SSDL and all MSL from scratch.
If you have started from an empty model, you will be asked to specify the target database. This screen is identical to the one shown when reverse engineering a model from a database. The implication here is that you will need an available server and database, which the system will use to determine what “flavor” of DDL to generate.
Once you have selected the target database, you will be presented with a summary screen which will provide a preview of the DDL that will be generated, as well as a tree-view of the objects.
The tree view:
The DDL view:
The DDL in the above screenshot is there merely as a graphic used to show how what the window will look like and is not intended to be representative of the DDL that will be generated by the system when you are actually creating your database (more about this soon). The DDL will however be read-only: Since it is generated by a template, editing of the results should either be done in the template, or in a separate DDL file which will not get regenerated.
Two options will be available:
- Save the DDL (off by default). This option will add the DDL as a dependent file under your EDMX file.
- Deploy the DDL (on by default). This option will deploy the DDL to the specified target database.
The generated DDL will not migrate data or schema - by default your database will be recreated from scratch.
Out of the box, we will support the Table-per-Type mapping strategy, meaning that we will create a table for each of your types and subtypes. For example, for a model like this…
…the following schema will be generated:
Of interest here is that PK-to-PK constraint between the Customer and Persons table. This helps enforce the inheritance relationship and the creation of foreign key columns to represent the various associations. In addition, the engine will create clustered keys on primary keys, and indexes on foreign keys that represent associations.
Under the Hood
The model first process is implemented using a Windows Workflow Foundation workflow that looks like this:
Here is what the stages do:
Creates the mappings (MSL) and database store model (SSDL) in the EDMX file.
Converts the SSDL to the format used by the Microsoft.Data.Schema APIs. This format is used as a “universal” database description format and includes physical information not present in the Entity Frameworks store model, such as indexes.
Uses the Microsoft.Data.Schema APIs to convert the universal format to store-specific DDL. In this release, we will support a minimum of SQL 2005 and SQL 2008. A provider model is in place, however, and we hope to add support for additional databases.
This activity pauses the workflow to allow the wizard to display the DDL.
Deploys the DDL to the target database.
Writes the DDL to the file system.
These stages are expressed in a XAML file which will be placed underneath your EDMX, to allow for customization: You can add your own steps or replace ones we have created with steps that you write.
Several of the steps above make use of templates to provide an additional point of control for users, and this is where we expect most of the customization to happen. These templates use the T4 Engine that is included in Visual Studio. We are currently working on making these templates as simple as possible by providing a set of supporting APIs that provide metadata collections that are designed for artifact generation – for example, a collection of all inherited properties for a type, or a collection of both inherited and defined properties. There are three templates:
CSDL to SSDL
Creates the SSDL for the target database.
CSDL to MSL
Creates the MSL for mapping the CSDL to the generated SSDL.
SSDL to DBSchema
Creates the physical database description, including elements such as foreign keys and indexes.
So, for example, if you need all table names to start with “_tbl”, you would modify the SSDL generation template to give all tables the appropriate name, and also modify the MSL template to provide the appropriate mappings. The DBSchema template will not need to be modified as it will automatically pick up the changes made to the SSDL which is its input.
As another example, if you wish to change the mapping strategy from Table-per-Type to Table-per-Hierarchy, you would need to change this same pair of templates.
Finally, if you needed to support a database for which no Microsoft.Data.Schema provider is available, you could replace the GenerateDDL step with your own template-driven activity which could them transform the schema “manually” to your store’s DDL format.
We hope this gives you enough information to understand the design and intent of this feature.
We would love to hear your comments.
Alex James Program Manager, Entity Framework Team
This post is part of the transparent design exercise in the Entity Framework Team. To understand how it works and how your feedback will be used please look at this post.