“Unable to find a table” on Database First Scaffold-DbContext - entity-framework

For some reason I'm getting this error. Below are the specs and then what I did.
Visual Studio 2017 v15.6.2
SQL Server 2008 v10.50.4
I opened the package manager console and added the following packages...
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
and then I ran
Scaffold-DbContext "Server=ph2srv76;Database=AVDRS;Integrated Security=True;Trusted_Connection=True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -force
but during the build I get the following errors...

I hate to post the obvious, but in my case (same error) I was targeting specific tables to model (with -t option) and didn't realize that the table names are case sensitive. Doh!

Those are just warnings (yellow), not errors(red) - you can safely ignore them

In case anyone else gets this I solved it by checking and fixing the following:
Make sure that the user id you are using in the scaffold-dbcontext actually has permissions on the tables you want to scaffold. If not the scaffold cannot find them.
Make sure the tables have primary keys or EF cannot scaffold them. Makes sense if you think about it.
After the above the scaffold worked for me!

In my case, I used -table option. I got the same error when I do this:
-Tables "REPORT, REPORT_TYPE, SAVED_REPORT"
The correct way is this:
-Tables "REPORT", "REPORT_TYPE", "SAVED_REPORT"

Related

Scaffold Views with Scaffold-DbContext from SQL Server

I have tried to scaffold two views from a database in a SQL Server. Code in .Net 5.0.
Scaffold-DbContext "conn-string"
Microsoft.EntityFrameworkCore.SqlServer
-OutputDir Entities -ContextDir .
-Context MyContext -UseDatabaseNames -Force
-NoPluralize -NoOnConfiguring -Tables View1,View2
This runs without error but no entities for this views are generated and I get a message:
Unable to find a table in the database matching the selected table 'View1'.
Unable to find a table in the database matching the selected table 'View2'.
How do I use Scaffold-DbContext to get these two views?
Aside from referencing the db schema, you could be stuck with this error because the actual project itself does not compile.
I commented out all the code associated to the DbContext model, and ran the following equivalent Scaffold command.
Scaffold-DbContext "Server=MyServer;Database=myDb;user=theUser;password=thePwd;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entities -ContextDir . -Context MyContext -UseDatabaseNames -Force -NoPluralize -NoOnConfiguring -Tables <<your database view>>
The command ran successfully and created my class in the root folder. I then moved it into my Models folder and went from there. That is optional of course.
There is more info here as to why you need to make sure the solution compiles before you run the scaffold command.

EF Core 2.0 scaffold-dbcontext Find ConnectionString in another project

I am using the EF Core 2.0 CLI command scaffold-dbcontext to reverse engineer poco classes from an existing DB (database first). The project that contains my appsettings.json file with the ConnectionString is different from the project that holds the poco classes generated by scaffold-dbcontext.
How can I get the scaffold-dbcontext command to find the ConnectionString in the appsettings.json file of another project?
As stated in this you can now specify your connection string to be named, which looks like name=MyConnectionString. The name of your connection string corresponds with the one defined in your appsettings.json. Example:
Scaffold-DbContext -Connection name=MyDB -Provider Microsoft.EntityFrameworkCore.SqlServer
where in appsettings.json you have something like this:
"ConnectionStrings": {
"MyDB": Server=mydb.database.windows.net;Database=mydb;Trusted_Connection=True;Encrypt=True;"
}
As of the time of this post, it doesn't appear that the scaffold-dbcontext command supports a appsettings.json connection string lookup. In other words, you must explicitly type the full connection string using the scaffold-dbcontext cli syntax:
Scaffold-DbContext -Connection "Server=(localdb)\ProjectsV13;Database=MyDbName;Trusted_Connection=True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Model -Context "MyDbContextName" -DataAnnotations -Force -Project MyEntitiesProject -StartupProject MyEntitiesProject
Not directly related to the OP, but just as a word to the wise... using the StartupProject option is helpful so you don't have to switch the Startup Project in Visual Studio to your entities project (e.g., MyEntitiesProject) in order to run the scaffold-dbcontext command.
There's a good link detailing the scaffold-dbcontext command options here.
Also be sure to have the following packages installed in your project in order to use the scaffold-dbcontext command in the nuget package manager console:
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.Design
For me both answers was usefull. I wanted to generate the context in another project, so it was required to specify the startup project and select the project where I had to generate the context. So I use:
Scaffold-DbContext -Connection name=DefaultConnectionString -OutputDir DataModel -StartupProject NameofTheProject.API Microsoft.EntityFrameworkCore.SqlServer
It can be done by using -StartupProject option in Scaffold-DbContext and making startup project reference Microsoft.EntityFrameworkCore.Design package (only caveat).
Example
Project DB: will contain EFCore autogenerated classes
Project API: contains appsettings.json with connection strings (must reference Microsoft.EntityFrameworkCore.Design)
Execute in the package manager Console
Scaffold-DbContext -Connection "name=<connection string name>" -Provider Oracle.EntityFrameworkCore -OutputDir EFModels -Context <DbContext class name> -Project DB -StartupProject API -Force
[if something is wrong you can have detailed logging with -Verbose option]

ConfigurationType error when using Entity Framework migrate.exe with multiple migration configurations

In my solution, I have a Data project that contains multiple Entity Framework 6.1.3 migration configuration classes. My goal is to run Entity Framework migration steps - for one of them, against an existing database - from TeamCity (or, to simplify, from a command line).
The migration configuration class I am using is the following:
namespace MyProject.Data
{
public partial class MyCustomMigrationConfiguration :
DbMigrationsConfiguration<MyCustomContext>
{
public MyCustomMigrationConfiguration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
MigrationsDirectory = #"Migrations\MyCustomContext\MigrationSteps";
}
}
}
I can successfully run the following command from Package Manager Console in Visual Studio:
Update-Database -Verbose -StartUpProject Web -ConnectionString '-my
connection string here-' -ConfigurationTypeName
MyCustomMigrationConfiguration -ConnectionProviderName
'System.Data.SqlClient'
I want to do the same thing from a command line, so I run this:
migrate.exe MyProject.Data.dll "MyCustomMigrationConfiguration"
/startUpConfigurationFile=MyProject.Web.dll.config
/connectionString="-my connection string here-;"
/connectionProviderName="System.Data.SqlClient" /verbose
However, I get the following error:
ERROR: The migrations configuration type
MyCustomMigrationConfiguration was not be found in the assembly
‘MyProject.Data'.
Any suggestions on how to fix this, please?
You can specify the directory where are all the dependencies (assemblies) needed to run your code. You can do that by using the /startUpDirectory option, as explained here:
Specify working directory
Migrate.exe MyApp.exe /startupConfigurationFile=”MyApp.exe.config” /startupDirectory=”c:\MyApp”
If you assembly has dependencies or reads files relative to the working directory then you will need to set startupDirectory.
Found the solution (I ended up downloading the Entity Framework source code from http://entityframework.codeplex.com/ and debugging the migrate console application).
Apparently, all the dependencies of MyProject.Data.dll need to be copied in the same folder with it and migrate.exe, otherwise the Entity Framework migrate.exe tool will throw the misleading error message above.
Entity Framework could really use better error handling and a clearer error message in this case.
As a reference to Entity Framework devs: the following code in TypeFinder.cs was returning a null type because the dependencies of MyProject.Data.dll were not copied in the folder of migrate.exe:
type = _assembly.GetType(typeName, false);

Entity Framework: Add-Migration fails with Unable to update database

I have been using Entity Framework (5.0) for a while now in a project (ASP.NET MVC in VS2012 Express). Right now, though, I am no longer able to add migrations.
PM > Add-Migration -projectName MyProject.DAL TestMigration
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
I do not know if this gives any clue but the 'Unable to ..." text is displayed in red.
I have tried to enable automatic migration (which makes no sense as I am trying to write the pending model changes to a code-based migration) and that results in the required migration in the database. However this is not what I want because I then I do not have a migration in the project.
I have tried to remove the database and recreate the database. The database is recreated (up to the previous migration) but when I then try to use the Add-Migration I still get the "Unable to update.." error.
Edit
I tried the -force parameter but with no difference.
The contents of my configuration class (I did not change anything after the previous migration):
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(Bekosense.DAL.Context.BekosenseContext context)
{
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageDrop);
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageCreate);
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentDrop);
context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentCreate);
context.Database.ExecuteSqlCommand(Properties.Resources.AddDbUsers);
}
Edit 2
I found out that I am able to do an add-migration when I comment the following line out in my DbContext:
//Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
when I leave the line above active and comment out everything in the Configuration file, it still won't work.
Why is the Database.SetInitializer line causing this strange behaviour?
You can reset the entity framework to solve your problem [But keep it mind it will bring the Migration to the default state]
Note: To take a backup before performing the following
You need to delete the present state:
Delete the migrations folder in your project
Delete the __MigrationHistory table in your database (may be under system tables)
You will find the __MigrationHistory table in your database [Under App_Data Folder]
Then 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
This may also help you
Never use automigrations, that gave me problems in the past (when migrating the database down, use the correct way to do it from the start!)
This line should be in your global.asax:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
And not in your DbContext!
Other tips if the above won't help:
Perhaps you have multiple layers in your application:
Add-Migration 000 -StartupProjectName "NameOfTheProjectInSolutionExplorer" -ConfigurationTypeName "MyConfiguration" -ConnectionString "theconnectionstring;" -ConnectionProviderName "System.Data.SqlClient" -Verbose
Above is the Add-Migration command i use for a multi-layered application.
Same thing for an update of the database
Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script
In my case I've got the same error because I was forcing ObjectContext.CommandTimeout on class DbContext at constructor method during migration.
Try removing it
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000;
This worked for me:
update-database -targetmigration:"0" -force -verbose
add-migration Initial
update-database

Strategy for Getting SQL for AutomaticMigrations

We're using EF 5RC, code first with migrations. I feel like this should be an easy question to answer (i hope). Is there a good way to figure out what the automatic migration is attempting to do.
I've added a migration through the Add-Migration PS command.
I've invoked Update-Database and all seems fine with that migration.
Now - I'm just running Update-Database like i normally do, but with the following error:
PM> update-database -Verbose
Using StartUp project 'Web'.
Using NuGet project 'DataAccess'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'UserGroup' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
No pending code-based migrations.
Applying automatic migration: 201206301526422_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.
Notice, i'm adding the -Verbose option, and I've tried it again with the -Script. But I have no idea what we're migrating to; and what SQL - or what it thinks will result in data loss.
I do not want to simply enable "allow data loss" here, but am trying to understand how to troubleshoot these migrations.
Thank you in advance!
Just run:
PM> Update-Database -Script -Force
This will generate the SQL and display it in a window without running it.
I got this error on Azure after a publish , but there u cant use -Force , so global solution (and no need for -Force on local too )
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true; // <-- THIS LINE
}