I am working on a entity framework project generating the Entity classes using the New-> ADO.NET Entity Data Model -> Code First From Database. I then select nearly 100 tables to generate (not all tables are suitable to go in the model).
Problem is I am regularly updating the schema, and the only way to refresh the model seems to be to delete and start again, which is fine except I have to re-select the nearly 100 tables again.
Is there any easy way of scripting this generation process?
You should look into using Entity Framework Migrations and start doing your schema changes from the code itself
Set the CompanyName.ProjectName.Infrastructure.EfRepository (the project which has your DbContext) as start up project of the solution
Open the Package manager console
Choose CompanyName.ProjectName.Infrastructure.EfRepository as default project
Run the following commands:
Enable-Migrations -ConnectionStringName "EfDataRepository"
Add-Migration Initial -ConnectionStringName "EfDataRepository"
Update-Database -ConnectionStringName "EfDataRepository" -Script -SourceMigration:0
Then delete the auto-generated Migrations folder within the EF project!
Where EfDataRepository is the connection string name.
Related
I deleted all migrations in the migrations folder and also deleted the database in SQL Server.
I know - now - these shouldn't be done, but I need to re-create the database structure to keep the application.
I tried 'add-migration initial' but the it simply generates an empty migration file and an snapshot file. If I try the 'remove-migration' then it complains about some missing migration file.
Is there anyway to 'reset' the snapshot like I just had created the DBContext, so it will create all the tables as in the current DbSet definitions?
I think the following solutions can help you:
First of all, make sure that the database is completely deleted because you said that the database was deleted in SQL. (After you create the first migration, a table called __EFMigrationsHistory is created, where the migration records are stored, if the database is not completely deleted, you must delete this table).
Second, delete the Migrations folder completely.
In the third step, run the following command.
Enable-Migrations -EnableAutomaticMigrations -Force
In the last step, run the following command
Add-Migration Initial
Steps :
Delete the state: Delete the migrations folder in your project
Delete the __MigrationHistory table in your database (may be under
system tables)
Run the following command in the Package Manager Console:
Enable-Migrations -EnableAutomaticMigrations -Force
Use with or without -EnableAutomaticMigrations
And finally, you can run:
Add-Migration Initial
Also this two link can help you :
Reset Entity-Framework Migrations
https://weblog.west-wind.com/posts/2016/jan/13/resetting-entity-framework-migrations-to-a-clean-slate
It seems the problem was in my project!
As #CodingMytra pointed in the comments, there were an active reference to the old database in my project. For some reason it was not rebuilding and not updating, thus not reflecting the changes in the models/dbcontext.
I created a new, empty project, imported all source files, generated a 'Initial' migration and updated the dabase successfully.
Thanks for all replys!
I'm developing a WPF app utilizing a SQL Server Compact 4.0 database. For the course of this project, we made several changes in the model structure with a number of code-based and later with automatic migrations. They all are stored in the _MigrationHistory table and represented by several migration classes.
Now it appeared that I need to considerably change the model. Since the app is still in the development phase, dropping data in the database is not a concern. I would like to get rid of the whole previous migration history and start a new clean model. So my question is what steps are to remove the whole history of migrations and start a new history with automatic migrations in the future.
What parts of the project must be deleted and how to do it safely?
First Make sure your project is backed up and your database is also backed up. In case something goes wrong.
If your project is setup using entity framework code first,
In the project you can delete all the migration files in the 'Migrations' folder except 'MigrationConfiguration.cs' contained within the project that is using entity framework.
Also if you are not concerned with dropping the database, then go-ahead and delete the entire database, then create a new one with the same name that is configured in your database context connection string found in your project's config file.
Rebuild your solution and create a new migration by typing the command in the package manager console 'add-migration' and provide a name. This will create a new migration to create the database for all your code first models. If the generated migration file looks correct, then run 'update-database' in the package manager to apply the migration to your empty database.
I'm new to ASP.NET and I'm working on this project that uses MVC. It's a simple website development project, and it uses SQL Server CE (.sdf) as the database.
I would like to change a couple of the underlying models, but that causes errors in the database.
I understand that I would need to change the database, and I know it's possible to create models automatically from the database.
I'm wondering if there is any way to create a database from the models. i.e. I don't mind losing all the data, but is there a way for me to change the models and then create a database that supports the existing models.
I hope that makes sense
Yes it possible to
Here is how you can do it.
There are two approaches to accomplish this task.
Method-1. (Via Package Manager Console)
This approach for the Code First.
Open your project and go to Package Manager Console as follows
Tools--> Nuget Package Manager--> Package Manager Console
First Enable Migrations in your project.Type following in console.
enable-migrations -contexttypename yourContextName
This command will add a Migrations folder in your project inside this folder you will
see Configuration.cs inside this file you will see a seed method
protected override void Seed(YourContext context)
you can use this method to seed your database.
Now run following command in your package manager console
add-migration anyNameOfInitialMigrations
Finally To update the database simply run following command.
update-database
Method-2.
Best approach for Model First.
Open your .edmx file.
Right Click--> on the model and then select "Generate Database From Model"
Make Sure you have proper connection strings in your web.config.
In my main project, I have configured a connection string to my database like this:
<add name="DefaultStoreConnection" "provider....">
In my infrastructure project, I have a database context with a default constructor that passes the connection name to the base class:
public DatabaseContext() : base("DefaultStoreConnection") {}
As soon as my application starts, EF generates a 'store.sdf' (SQLCe database) in the application output folder (\bin).
Now, I wanted to reset all migrations and start with a plain database. I deleted the 'store.sdf' in the \bin directory, deleted all migration files and then called in the Package Manager Console:
Enable-Migrations -Force -ProjectName "MyInfrastructureProject" -StartUpProjectName "MyMainProject".
This worked fine, a new migrations configuration class was generated. Then I ran:
Add-Migration Initial -ProjectName....
And then the following line appears:
A previous migration called 'Initial' was already applied to the target database
Where? Where does this migration has been applied to? Where can I reset this 'migration'?
It should be in a folder containing all the migrations, but it's possible that it's deleted after it has been applied to database. You can see list of applied migrations in __MigrationHistory table of your target database. If you wish to rescaffold the database, empty the __MigrationHistory table.
I run to the same problem as you. After a day of google search without a single useful help, i figured it out myself that this is Visual Studio bug where your solution have more than one Mvc projects. The add-migration will check on the older Mvc project to create migration file for your current project (that is why i call it BUG).
To avoid this, you should only use one Mvc project per solution.
Have a look at the app_data folder of your project.
I'm using code first migrations. Is there a way to display pending model changes in package manager console before I scaffold a new migration?
The accepted answer tells how to get the SQL for a already scaffolded model change before applying to the database.
The original question regarded model changes pre-scaffolding (i.e. changes in the model since the last "add-migration" before running the next "add-migration" ...)
To that answer i will just say: scaffold anyway, that gives you your preview. By that i mean, run "add-migration preview" or something similar, it will create the scaffolded migration with the model changes that you are interested in. Then just delete if from your solution ...
The point here is that there is no need to "preview" when actually "doing" can be quickly undone. Some might think deleting a scaffolded migration version from the migrations section of the solution would break something, but no it is very well supported.
You can even test scaffold, then create the sql script as Colin suggest in his answer, to get the full SQL. Still nothing has been done at this point, so delete the migration version if you'd like.
There is no way that I know of to view pending changes in the model before scaffolding the migration, but I can't think of a reason not to scaffold the migration using Add-Migration so that the pending changes can be viewed in the migration file. There is no need to apply those changes to the database and the scaffolded migration can always be deleted.
Once the migration is scaffolded, if you use Update-Database -Script entity framework generates a SQL script rather than executing the changes directly.
You can get help on the EntityFramework in the package manager using get-help EntityFramework
And you can get help on the Update-Database command using the following:
get-help Update-Database
get-help Update-Database -detailed
get-help Update-Database -full