Delete one of many DbContexts? - c#

Right now I have two DbContexts which I have been maintaining with the usual Add-Migration and Update-Database. So I have a number of migrations in this ASP.NET Core MVC application. Now I would like to delete one of the contexts. Doing this by just deleting the class that I have created derived from DbContext doesn't work because now all of the migrations in the project reference the DbContext and if it is removed compilation obviously will fail. What is the recommended way to delete a DbContext (by extension delete the database)?

firstly delete reverse all migrations in DB like this:
Update-database -context [name Of Context to delete] -migration 0
then remove all migrations
Remove-migration -context [name Of Context to delete]
And now you can feel free to delete the context.
Notice: you lost data some data from DB! (create backup of your data in DB if you need
)

Related

EF Core 3.1: Deleted all Migrations and the Database, how to recreate all tables in a new database?

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!

How to restore migration history with EF Core

Let's say I have a database which is created by three migrations. They can be seen in the table dbo._EFMigrationsHistory and the content could look like this:
MigrationId ProductVersion
20200516181941_InitialMigration 3.1.4
20200517091058_AddedIndexes 3.1.4
20200605115456_IntroducedBreweries 3.1.4
Now let's say that I for some reason lose all of the table (or just a part of it). So suddenly the table look like this:
MigrationId ProductVersion
20200517091058_AddedIndexes 3.1.4
20200605115456_IntroducedBreweries 3.1.4
And then I make a new migration, because i changed something in the database
Add-Migration SomethingChanged
This will work fine, since we aren't talking to the database at this point. But if I try to update the database, like this
Update-Database
It will fail, because it it trying to re-run the InitialMigration (or at least so I assume). So a common error is that the tables created in the InitialMigration cannot be created, because they already exist.
During development you can simply nuke the database and/or migrations, but that's not a very viable strategy for production. It can also be done with Script-Migration, which has a from/to option, allowing something like this:
Script-Migration 20200517091058_AddedIndexes 20200605115456_IntroducedBreweries
But this doesn't seem to work on Update-Database (not in the documentation either).
Is there any (production safe) way to fix this, so that the migration history isn't broken for all eternity?
The best way I can think of, is to manually insert the missing row(s) in the database, but this seems quite hack-ish...
The Issue: You have mucked up your migrations and you would like to reset it without deleting your existing tables.
The Problem: You can't reset migrations with existing tables in the database as EF wants to create the tables from scratch.
What to do:
Delete existing migrations from Migrations_History table.
Delete existing migrations from the Migrations Folder.
Run add-migration Reset. This will create a migration in your
Migration folder that includes creating the tables (but it will not
run it so it will not error out.)
You now need to create the initial row in the MigrationHistory table
so EF has a snapshot of the current state. EF will do this if you
apply a migration. However, you can't apply the migration that you
just made as the tables already exist in your database. So go into
the Migration and comment out all the code inside the "Up" method.
Now run update-database. It will apply the Migration (while not
actually changing the database) and create a snapshot row in
MigrationHistory.
You have now reset your migrations and may continue with normal migrations.

EF creates InitialCreate in MigrationHistory then migration is turned on & InitialCreate has a new MigrationId causing pending migration issue

I have two solutions, the base solution with no migrations(which is in production, so I can not wipe the data) and now I have branched of this to set up migrations and make some model changes.
First I need to set up migrations on the branched solution (second solution) so that I can apply the model changes so I:
Turn on migrations which auto creates an InitialMigration
Enable-Migrations -ContextTypeName Context
Make a blank migration based on the suggestion from https://www.apress.com/gp/blog/all-blog-posts/secular-trends-for-the-cloud/12097630
Add-Migration InitialBlank -IgnoreChanges
Update Database * update-database*
Make my model changes
Add a migration containing my model changes * Add-Migration add_entity*
Run Update-Database
So I delete the database created as I need to run the first solution to create the initial db setup (to mimic live).
When I run the first solution it creates an entry in MigrationsHistory table named InitialCreate (201807061432030_InitialCreate), which has been auto created. I then run update-database on the second solution which applies my model changes fine although their are discrepancies in the InitialCreate MigrationId.
Migration entries in my second solution (in order they were created and the order they are in the solution):
- 201807061257015_InitialCreate
- 201807061315294_InitialBlank
- 201807061323086_add_entity
Migration entries in the migration history table after running the first then second solution:
1 | 201807061315294_InitialBlank
2 | 201807061323086_add_entity
3 | 201807061432030_InitialCreate
The second solution runs fine but when I try to add any data I get System.InvalidOperationException: 'The model backing the 'Context' context has changed since the database was created. Consider using Code First Migrations to update the database.
I have tried to create another migration on the second project to make sure their are no model changes that have not been migrated (their shouldn't be) but I get an error.
Unable to generate an explicit migration because the following explicit migrations are pending: [201807061257015_InitialCreate]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
My questions:
How do I resolve the MigrationId mismatch? As the first solution did not have migrations turned on and when I do turn them on (in the second solution) it creates a new id.
Could the exception System.InvalidOperationException: 'The model backing the 'Context' be thrown by the MigrationId mismatch or could anyone point me at why this could be happening? I have had a look into this error but the solution's I found don't seem to work:
Deleting the migrations history table is no good as I can not do this in production because of customer data.
The other solution I found of adding Database.SetInitializer(null); to global.asax seems to make no difference.
Why does the order of my migrations look different once they have been applied in the migration history table?
Thanks in advance!
I am not sure if this will work but I think I may need to manually delete the first InitialCreate and edit the db entries to reflect the correct InitialCreate. Based of this SO question I just found https://stackoverflow.com/a/13108243/3172635.
I will have to try this Monday though.
Edit: I first tried deleting the InitialMigration entry in the _MigrationHistory table but this does not work as it tries to apply the InitialMigrations again but cant as the tables are already created. So what I did was update the MigrationId for the InitialMigration entry to reflect what it was in the new project.
The sql I used:
SET MigrationId='201807061257015_InitialCreate' WHERE MigrationId = '201807061432030_InitialCreate'

How to generate Entity Framework Objects from script

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.

EF Migration object already exists error

I am working on an ASP.NET MVC project with Entity Framework with code first from database. I get the models for each table in the database. I made some changes in the models, enabled migrations and when I initial the migration I get an error:
There is already an object named 'TableName' in the database."
I tried with update-database -force but didn't help. The initial migration creates the tables that already exist!
How to make the initial migration apply the changes on the models and not create the tables from beginning?
And what is the best practice to sync changes between database and models in this case?
try to Run the
Add-Migration InitialCreate –IgnoreChanges
command in Package Manager Console. This creates an empty migration with the current model as a snapshot. and then Run the
Update-Database
command in Package Manager Console. This will apply the InitialCreate migration to the database. Since the actual migration doesn’t contain any changes, it will simply add a row to the __MigrationsHistory table indicating that this migration has already been applied.
see this
then change your models and add migration.
another approach is to simply comment all the code on up and down methods
Best and working For me idea is to comment all the code in UP and Down functions of Initial migration file and then fire
dotnet ef database update this should work fine,make sure you update migration before commenting out initial migration
If none of those answers work for you, you may check if in your code you use the method
context.Database.EnsureCreated()
Be aware that that method doesn't apply any migrations
(source) (you can check this making a sql query to the database and like "select * from __EfMigrationHistory" and be sure that there are no migrations on that database.
EF provide a really good method to help this that is
context.Database.Migrate()
that no only it will ensure that you have a database, but also use migrations and migrate yout db to the last version.
Hope it helps
This error appears when you deleted previous migrations and your new migration try to create new table that already exist. Recover previous migration and everything will be ok.
Amr Alaa solution works, but the database didn't migrate to the latest model.
Here's how it worked (using automatic migration) :
Delete Migrations folder
Execute enable-migrations
Set this two properties to true in the newly created Configuration.cs
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
Execute Update-Database -Force
Your database will be updated to latest scheme and ready.
hope this helps.

Categories

Resources