does anybody know if it’s possible to query an sql server with my own query?
I can't find any information, that I can get to work, so perhaps there is something else I'm missing?
I have tried a LOT of samples from different websites, so it's for the lack of trying
(I'm new to ef (and ef core))
I would like to write a sql to call a database function that for some reason is not part of the database scaffolding
I have added the following nuget packages (I don’t think I’m missing any?)
PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.6" />
PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="6.0.6" />
PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="6.0.6" />
PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.6">
PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.6" />
PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.6" />
PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.6">
I have run dotnet tool install --global dotnet-ef
(Hours spend on scaffolding not working, before I ran that command)
I used the following to scaffold
dotnet ef dbcontext scaffold "Data Source=myservername;Initial Catalog=mydbname; Persist Security Info=True;User ID=myuserid;Password='mypassword'" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models
It generates fine into models folder
But who do I write a "raw" query, so I can use the db function?
This document describes how to configure EF to talk directly to a UDF.
See the section "Mapping a method to a SQL function"
Related
I needed to scaffold the database tables of my database to my project so as usual, I ran:
Scaffold-DbContext "User ID=xxx;Password=xxx;Host=localhost;Port=5432;Database=xxx;" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Database -f
But realised I was getting two classes for a couple of tables.
I have a table called Building and another called Appartment but the scaffold command created Building.cs, Building1.cs, Appartment.cs, Appartment1.cs.
The other tables were fine.
The only references to these tables are the ones within OnModelCreating in addition to other tables which have a FK to Building and Apartment. Fk's seem to not be present on the main classes (the ones without 1 appended).
I am using version 3.1.4:
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.4">
Has anyone seen this before?
I added audit tables for both of the tables in question under a different namespace. Completely forgot about them.
I'm trying to build a simple CRUD app using Blazor in Visual Studio 2019 - I have watched over 7 tutorials between YouTube, PluralSight, and Channel 9, and in all of them, they use Entity Framework Core to create the Database and Tables from within Visual Studio, which is understandable as code-first is ideal architecture.
However my database and tables already exist, and for the first step, I just want to connect the Blazor app to a table and read it into UI columns.
How would I accomplish the step of importing an existing database table in Visual Studio 2019? If there is documentation on the web that refers specifically to accomplishing this in Blazor, please do point me to that, as I'm not able to find anything outside of some old ASP.Net MVC docs.
Add the following Packages to your project:
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.1">
Add your database connection string to appsettings.json
{
"ConnectionStrings": {
"MyConnection": "Server=tcp:<yourServer>,1433;Initial Catalog=<yourDatabase>;Persist Security Info=False;User ID=<yourDatabaseUserName>;Password=<yourDatabaseUserPassword>;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"
}
}
Open PackageManagerConsole and type
Scaffold-DbContext -Connection name=MyConnection -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyDbContext -Force
This will create a Models folder in your project containing MyDbContext.cs plus a
<TableName>.cs-file for each table in your database.
Note: For the first import of your database you don't need the -Force option in the Scaffolding. It will be needed though, if you make changes in your database after the first import and want to update your cs-classes afterwards.
In our company we are using EF Core Power Tools for generating the context and the model classes for Entity Framework Core.
You can find the corresponding documentation under https://github.com/ErikEJ/EFCorePowerTools/wiki/Reverse-Engineering. With this tool you can directly generate the classes within Visual Studio and you also can store the configuration that you easily can update your classes if the database changes.
Rene's answer is correct it just needs 2 amendments:
You need to add a / before the > on the last package reference.
You will also need to reference "Microsoft.EntityFrameworkCore.Design" Version="3.1.1"
I've spent a day trying to migrate an Entity Framework 6 SQL Server CE to PostgreSQL.
I've copied the database over fine, but I can't seem to get the data provider to work.
Firstly I tried the older 2.2.7 version of the EF provider, which doesn't require .NET 4.5 (because our project can't use it), but that didn't work. I've been using NpgsqlConnection instead of SqlConnectionStringBuilder and changed the app.config to have a connection string with Host (I tried Server but it didn't like it) and Database values, and made sure the EF section is as follows:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>
</entityFramework>
I've now ignored this limitation just to try and get it working, so I have the EF6 v3.1.1 version of the EF provider and the latest .NET provider (v3.2.2) and that's not working either.
In an attempt to fix it, I've also been trying to re-sync the EDMX from the SQL Server CE to the PostgreSQL replacement by installing the VS2015 extension, but it just gave a message saying an error occurred, so I tried this: https://github.com/npgsql/npgsql/issues/1514
which got further, opening the window, but then crashed as soon as I typed into the boxes. Since upgrading the project to .NET 4.5, this provider no longer appears at all...
I've tried reinstalling everything several times and restarting VS a lot, and Since upgrading I've also tried installing the GAC files, as it wasn't clear if the VS extension needed them (also v3.2.2).
Is anyone able to shed some light on how easiest to get all this working, preferably without the requirement of .NET 4.5?
Thanks
I got it working with installing the Visual Studio Extension Npgsql PostgreSQL Integration.
Follow the instruction on this page: https://www.npgsql.org/efcore/
This thread led me to the right path: Add custom data source to visual studio 2015
Installing the npgsql extension as described in tsChan's answer wasn't enough for me, I also had to modify my app.config (I suspect because it was created before I installed the extension) to include the npgsql data provider in the EntityFramework section as follows:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>
</entityFramework>
After I did that, the provider appeared in the wizard options.
PostgreSQL data provider missing from wizard in Visual Studio 2019 //It works
Install this extension "Npgsql PostgreSQL Integration" https://marketplace.visualstudio.com/items?itemName=RojanskyS.NpgsqlPostgreSQLIntegration
install "EntityFramework6.Npgsql" package from Nu get Package manager
After installation without restarting or editing app.config file you will see changes on your project references folder and app.config file
Now click on add->new item->ADO.NET Entity data model->EF designer from database->new connection->change you will see postgress in data source
I followed the guide here: https://github.com/npgsql/Npgsql/wiki/Visual-Studio-Design-Time-Support---DDEX-Provider#install-npgsqlddexprovidervsix
When I get to the step: Change Data Source, only the SQL Server providers appear in the list. (PostgreSQL Database) does not show up.
What troubleshooting steps can I perform to figure out why it's not showing up?
Win7 x32, VS2010 Pro
Hopefully they don't delete this answer, as I have used this answer when I read a previous question a lot like yours. After about a week of research and banging my head against my desk, I FINALLY got my Npgsql MVC Entity Framework application to work... and work WITH the wizard. The steps are below....
1) Close Visual Studio, then download and install Npgsql PostgreSQL Integration from: https://marketplace.visualstudio.com/items?itemName=RojanskyS.NpgsqlPostgreSQLIntegration
2) Reboot your computer. (yes, it's needed, I promise)
3) Open visual studio and install the following NuGet packages, IN THE ORDER listed and the VERSION listed...
--> EntityFramework version 6.0.0, then clean and rebuild
--> Npgsql 3.1.0, then clean and rebuild
--> EntityFramework6.Npgsql 3.1.1, then clean and rebuild
NOTE: You may need to uninstall other Nuget packages if these will not install in the order and version listed. If so, just make note and add them back later. and yes, you will want to clean/rebuild between each one above.
4) Close all applications and restart your computer. (yes, it's needed, I promise)
5) After your computer restarts, open Visual Studio again and go to your solution. NOTE: I advise you add a new project for your database connection, but this is more a preference than anything.
6) Try using the Entity Framework Wizard again. You should see the Npgsql selections and it shouldn't just crash on you.
I went with steps Ashley suggested and added to App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<providers>
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>
</entityFramework>
</configuration>
also used versions of packages:
<PackageReference Include="EntityFramework">
<Version>6.4.4</Version>
</PackageReference>
<PackageReference Include="EntityFramework6.Npgsql">
<Version>6.4.1</Version>
</PackageReference>
<PackageReference Include="Npgsql">
<Version>4.1.3.1</Version>
</PackageReference>
and it started working - now I have PostgreSQL Database data source listed - Visual Studio 2019 (16.5.5) with .net framework 4.7.2 library project (which I reference in other project).
PostgreSQL Database data source is now available
Not sure if rebuilding in step 3) and 2nd restart in 4) was required,
wanted to reply to original Ashley answer but "You must have 50 reputation" ...
I had same problem. The manual way is difficult. I couldn't use it. Try to use automatic setup file. But not any versions of npgsql contain it.
For example can use version 2.2.5 from official site (setup exe file from lower part of page): https://github.com/npgsql/npgsql/releases/tag/v2.2.5
I have a project that I just updated using nuget. This updated entity framework from 6.1 to 6.1.1, and it updated sqlite to 1.0.93. I wanted to update my model from my latest database. I did the steps of
1) Model from Database
2) Select sqlite database
3) Generate
After the generation I received the following error message shown below. I have the 1.0.93 design time components install. Does anyone know what exactly is causing this error. The project references and versions all match the versions shown above.
Error Message:
Your project references the latest Entity Framework; however and Entity Framework database provider
compatible with this version could not be found for you data connection.
Update:
I ended up installing 6.1.0 manually using the package manager console
Install-Package EntityFramework -Version 6.1.0
Then in my csporj files replacing
packages\EntityFramework.6.1.1
with
packages\EntityFramework.6.1.0
I tried creating EF Designer from Database and Code First from Database but I am still getting the same error.
UPDATE
I have followed the instructions Tom has provided, and thanks time for taking the time to respond in depth it is appreciated. But I cannot get the entity framework designer to work with SQLite 1.0.93. What I have found:
1) When I add the SQLite data source from the tools menu as Tom describes I see the SQLite data provider.
2) But when I restart visual studio the data source is not connected
3) The data source can be refreshed and it is valid after restart
4) Add new data item but SQLite is not listed as a provider
I have double checked the registry and EF6 is appended to the invariant name, the SQLite dlls are registered in the GAC. I will try to see what else I can find but at this point I am not sure what to look for. As a side note I have tried dotConnect and it does not work either with EF 6.1.1.
Update 2
Does anyone know if the Entity Framework Designer has a logging option to find out what might be happening?
[ UPDATE : for an easier solution that works with Visual Studio 2013 Update 4 (Pro and Ultimate) and recent versions of Sqlite Providers and EF, look at the solution 'broslav' posted below. Don't know if it works with Express editions... ]
Ok, this is a suggestion. This does NOT work for Visual Studio Express editions.
Also, I'm not sure how to get it to work for an update of an existing project.
And it is an absolute pain in the butt.
I haven't tested if everything is required, but this should work:
First, do NOT use the NuGet package for SQLite, but download the assembly installer from here:
http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Install the Setups for 32-bit Windows (.NET Framework 4.5.1) installer: sqlite-netFx451-setup-bundle-x86-2013-1.0.93.0.exe (10.00 MiB) (NOT the 64-bit version). This is the only one with the designer.
Install and select to install in the GAC and install the Designer for VS13.
For the following, the exact order is important!
I made a video of these steps, see: http://vimeo.com/103372740
Create a project in VS13. Target the build to framework 4.5.1 and x86 explicitly. Save and build.
Next, install the latest EF 6 package (6.1.1) from NuGet. Save and build.
Manually add references to the installed SQLite assemblies (including the Designer) , under the Reference Manager under Assemblies you can find the Extensions option for selecting the four added assemblies in the GAC : System.Data.SQLite Core + Designer + for Entity Framework + for LINQ.. Save and build.
Then create a connection to your database via Connect to Database under Tools. Before you do anything else Save and Build and then RESTART Visual Studio. DO NOT DO ANYTHING ELSE before starting the ADO.NET Entity Data Model wizard, so DO NOT refresh the database connection.
Add an ADO.NET Entity Data Model, select Generate from Database.
Your database connection will show up in the drop-down list. Keep it there, but select to create a New Connection anyway and select the exact same database again (as if you are creating a new connection). It sounds silly, but it is crucial, see image below...
When I actually Added an ADO.NET Entity Data Model this way it did present the annoying error, but the Next button is selectable and everything worked regardless (amazingly)!
Designer works, retrieving data and writing data works.
Haven't tested deployment on another machine though... I'm using Win7 64-bit.
CHANGED UPDATE: To get the correct configuration to actually access the database, you have to install the System.Data.SQLite.EF6 package from NuGet after doing all of the above, then add
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
to the App.Config and remove the other providers and remove everything in between <system.data></system.data>, otherwise you'll get some exception. But note that this means that every time you want to update the EDMX model, you have to change the App.Config invariantName="System.Data.SQLite" to invariantName="System.Data.SQLite.EF6" and vice versa.
** Is this getting ridiculous? Yes, it is! And it gave me quite a headache... **
This is what worked for me:
had Windows 8.1 Pro x64
had VisualStudio 2013 Ultimate Update 4
installed http://system.data.sqlite.org/downloads/1.0.94.0/sqlite-netFx451-setup-bundle-x86-2013-1.0.94.0.exe (in GAC, plus designer)
installed EFTools6.1.2ForVS2013.msi from https://www.microsoft.com/en-us/download/details.aspx?id=40762
in old or new solution/project that targets .NET 4.5.1 and Any CPU installed via NuGet package System.Data.SQLite
added new model from database (I did not see the SQLite provider here until I installed the NuGet package inside the project)
to actually access the data, I had to rearrange the add and remove items inside the DbProviderFactories tag in the app.config
So the packages I had were:
<packages>
<package id="EntityFramework" version="6.1.1" targetFramework="net451" />
<package id="System.Data.SQLite" version="1.0.94.1" targetFramework="net451" />
<package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net451" />
<package id="System.Data.SQLite.EF6" version="1.0.94.0" targetFramework="net451" />
<package id="System.Data.SQLite.Linq" version="1.0.94.1" targetFramework="net451" />
</packages>
and the app.config that worked for me had contents:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog" />
<!-- Uncomment the below section to write to the Application Event Log -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter" />
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<system.data>
<!--
NOTE: The extra "remove" element below is to prevent the design-time
support components within EF6 from selecting the legacy ADO.NET
provider for SQLite (i.e. the one without any EF6 support). It
appears to only consider the first ADO.NET provider in the list
within the resulting "app.config" or "web.config" file.
-->
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="WorkinDataEntities" connectionString="metadata=res://*/WorkinDataModel.csdl|res://*/WorkinDataModel.ssdl|res://*/WorkinDataModel.msl;provider=System.Data.SQLite.EF6;provider connection string="data source=X:\dev\proj\workin\bin\data.db"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
As you can see, somehow in the end, for me, it was not necessary to remove "EF6" from invariantName or to remove or rearrange other providers or default connection factories. I didn't have to do any reg hacks. Rearranging add/remove tags (that were added during NuGet System.Data.SQLite 1.0.94.1 package installation) in the start-up project's app.config made the difference.
After all the above, I updated EntityFramework to 6.1.2 via NuGet and both updating the model from database via designer and accessing the data at runtime still works.
I finally have steps to consistently add Sqlite and EF6 to a project:
EF6: versions 6.0.0 to be 6.1.3 (currently the latest version).
System.Data.Sqlite: 1.0.93 - 1.0.95 but not 1.0.98 (currently the latest version).
To avoid getting System.Data.Sqlite 1.0.98 , do not install using Nuget Package manager. Manually install System.Data.Sqlite. Unfortunately, http://system.data.sqlite.org/ does not readily list previous downloads.
x86 System.Data.Sqlite 1.093
x64 System.Data.Sqlite 1.093
I use Nuget Package manager and install EF6 and then I manually added System.Data.Sqlite library. I have tried multiple times to use 1.0.98 but I cannot
App.config File
For my implementation, I am working with database first an manually coding the entity data classes
public partial class MyDbContextEF : DbContext
{
public MyDbContext() : base("name=MyDbContext") { }
public DbSet<DataRecord> DataRecords { get; set; }
}
[Table("TableName")]
public class DataRecord
{
[Key]
public Int64 RowID { get; set; }
public string Name { get; set; }
}
I reported this issue and a fix is under way, and a workaround appears to be available (I have not tested it) http://system.data.sqlite.org/index.html/tktview?name=e634e330a6
I had the exact same problem--The model designer wizard was not showing my sqlite db in the dropdown list. I was able to resolve it by fiddling with the sqlite db connection and tables.
0a) I added a connection through the Server Explorer to my sqlite file (the sqlite providers and servers showed in new connection wizard for the Server Explorer but not my edmx Model Wizard)
0b) At this point it was not showing in the edmx Model Wizard still, but did show as a Data Connection in the Server Explorer.
1) I added a table to the sqlite file.
2) I closed the connection to the sqlite db through the Server Explorer
3) I opened the design of my dummy table om the sqlite file through the Server Explorer (thus reinitiating the connection)
4) I tried to "Update Model from Database..." and it was showing in the dropdown list
Another step I did not include above was I created and deleted an .mdf SQL server database New Item... > Database Service.... I did that shortly before trying the above steps. I assume that wouldn't matter but you never know.
Not sure what exactly did it. It seemed a manual disconnect and reconnect through the server explorer made VS "wake up" and display the server in the list. Try fiddling with the connection and tables a bit to see if that wakes something up.
I had this problem as well. The cause was probably that I forgot to tick the visual studio checkbox when installing the system.data.sqlite driver and then installed over that with the checkbox ticked without deinstalling the system.data.sqlite driver first. This how I solved it:
Uninstall the system.data.sqlite driver.
Reboot.
Install the system.data.sqlite driver
Delete the old solution and set it up anew, just like you did (might not be necessary).
Add the ADO.NET entity model (the template was missing for me, this answer helped with that)
The sqlite data source should now be available.