How to use Postgresql Database in Silverlight application? - c#

I'am trying to use Entity Framework with Postgresql Database in my Silverlight application ,for that I am using npgsql data provider .
Fowlowing this link I registered Npgsql and Mono.Security in the GAC, and I added a provider factory entry into section of machine.config. I created a .edmx file with EdemGen2 and finaly I added a string connexion to my app.config as follows:
<add name="PostgreDatabase" connectionString="metadata=res://*/EspaceModel.csdl|res://*/EspaceModel.ssdl|res://*/EspaceModel.msl; provider=Npgsql;provider connection string=" Port=5432;Encoding=WIN1252;Server=localhost; Database=postgis;UserId=postgres;Password=admin"" providerName="Npgsql"/>
But, I still can't access my data. Any Help ?

Related

SqlClientFactory error with EF 6 - Unable to determine the provider name for provider factory

I'm getting this error when I attempt access a collection within the context:
Unable to determine the provider name for provider factory of type 'Microsoft.Data.SqlClient.SqlClientFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.
My config has the standard connection string:
<add name="someDb" connectionString="Data Source=****;Initial Catalog=****;Integrated Security=SSPI;MultipleActiveResultSets=True;" providerName="Micorsoft.Data.SqlClient" />
This has been working fine for years (the providerName was System.Data.SqlClient), now trying to upgrade to Standard2.0 with EF 6.2.
Hoping there's a fix I can make to the connection string or in the DbContext, but I'm stumped.
Do you have NuGet installed if not goto NuGet package manager and install then
Simply add a NuGet dependency on Microsoft.Data.SqlClient and update
this may help you.

Azure Function unable to use connection string with no Entity provider

I have an Azure Function system that's using a DAL dll. This dll uses entity framework to connect to a SQL database and is in the UnitOfWork format for our database first code.
In azure functions there isn't the standard "app.config" file to update with my connection string to my database. So I added it here in the Application Setting's GUI:
I have copied the code from the app.config by just taking the value from the config, converting the " values, and pasting it into the GUI.
<add name="Entities" connectionString="<This is what I copied>" providerName="System.Data.EntityClient" />
However, whenever I run the code, I get this error:
2016-10-14T12:39:44.248 C# ServiceBus queue trigger function processed message: test
2016-10-14T12:39:44.265 Getting UnitOfWork
2016-10-14T12:39:44.607 Getting Repository
2016-10-14T12:39:44.639 ERROR The connection string 'Entities' in the application's configuration file does not contain the required providerName attribute."
So, typically the provider name would be the entity framework, but I don't know how to include that in the code. My question is, how do I connect with this connection string, and have an entity framework provider?
If you are using Entity Framework 6 or greater, have you tried using Code-based configuration? Some sample implementation can be found here,
http://www.entityframeworktutorial.net/entityframework6/code-based-configuration.aspx
How to set connection in Entity Framework 6 using Code-Based Configuration

How to publish asp.net project + Sql [First Migration] on azure

I have a project and want to publish it to azure . I tried to publish it but I have no idea.
I have no problem with publishing my project, but how I can upload or publish my sql database that I created using entity framework code first migration with my project, because I have data on it also the tables , so anyone have Idea of instructions how I can publish my project with the sql database?
Update: I Published my project , after I created a db and web app on azure but I have a problem with editing my connection string , if someone can help with that ..
My deafault connection string :
<add name="SmartBookLibraryModel1" connectionString="data source=FIRAS-JC\SQLEXPRESS;initial catalog=SBL;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
and this connection string I got from the sql database from azure :
Server=tcp:jhm8n1ya03.database.windows.net,1433;Database=smtebooAIkF3XGJh;User ID=Firasmsw#jhm8n1ya03;Password={your_password_here};Trusted_Connection=False;Encrypt=True;Connection Timeout=30;
how the new one should be look ??
Thanks.
Basically you have to create the azure database. Add the connection string to your configuration files (web.config). Make sure the user you use in the connection string has the rights to do the changes to the database. And then deploy the project to azure.
When the application starts, the migrations will be applied to the database.
get started migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application

How to use Entity Framework 6 to migrate database to local SQL Server from network server

I got a ASP.NET MVC 5 project which is already published in a server. But I have to extend it. Thus I'm trying to make local development environment with local database. I don't want to loss any data which is already working. As this is huge project. So all model and controller is done.
I'm also not an expert in ASP.NET world. After searching for a while I found there is way called code first approach.
As I have all the model so I'm assuming it should be able to make all local database in my machine.
The actual project connection strings looks like this:
<connectionStrings>
<clear />
<add name="Name.DataSourceConnectionString"
connectionString="Data Source=test.test.com;User ID=myUser;Password=myPass"
providerName="System.Data.SqlClient" />
</connectionStrings>
So for local machine I updated as:-
<connectionStrings>
<add name="My TEST"
connectionString="Data Source= 192.168.1.12;Initial Catalog=MyDB;Persist Security Info=True;User ID=dev;Password=dev"
providerName="System.Data.SqlClient" />
</connectionStrings>
I got project source and build and launch the service locally. When I try to logged in I get following error:-
The model backing the 'ApplicationDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).
Note that same login is working fine in server.
Then I follow the link.
In package management console I insert command enable-migrations and then update-database -Force. I got following error:-
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
I have SQL Server 2012 Express installed. I suspect my connection string is not defined correctly. How do I define it? Also any suggestion how to have local set-up development environment for working ASP.NET service?
connectionString="Server=myip;Port=3306;Database=mydatabase;Uid=admin;Pwd=password;"
you could try this maybe you missing port and select database don't know how many database is configure in your mssql server.
Code First, despite its name, can either create a new database or work with an existing database. However, and this is key, it cannot both create and manage tables and work with existing tables in the same database (at least not with the same context).
You can have multiple contexts, but they must be entirely segregated, i.e. they can't reference entities tracked by a different context or they'll attempt to take control of those entities away from that other context.
Long and short, if you have an existing database that you need to work with, Code First migrations are pretty much out the window. You can create new entity types, but you'll need to create the tables for them manually in your database.
As far as just get a local copy goes, though, all you need to do is take a backup of the production DB and restore it locally. It really has nothing to do with Entity Framework or MVC.

Entity Framework 6: Unable to load the specified metadata resource

First, this is related to another question here on SO:
I've read and debugged my issue with the following SO article & blog:
MetadataException: Unable to load the specified metadata resource
and
http://blogs.teamb.com/craigstuntz/2010/08/13/38628/
BUT...I'm still having questions beyond just this 'fix'
I have a WebAPI (2.1), the connection string in my WebAPI is as so:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
When I call ToList() on a DbSet in my WebAPI (pseudo code):
DbContext _DbContext = new ProjectEntities();
DbSet<TEntity> _dbSet = _DbContext.Set<TEntity>();
_dbSet.ToList();
It works great!
When I call the same from within a WINDOWS SERVICE, I get the following error:
The app.config entry for the connection string is exactly the same as the web.config:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://*/ProjectModel.csdl|
res://*/ProjectModel.ssdl|
res://*/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
Now, the blog shows to reference the dll manually as so:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data.dll/ProjectModel.csdl|
res://Project.Data.dll/ProjectModel.ssdl|
res://Project.Data.dll/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.0.1;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
This does NOT work/fix the issue
The only way I've been able to fix it, is to use the fully qualified name:
<connectionStrings>
<add name="ProjectEntities" connectionString="
metadata=res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.csdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.ssdl|
res://Project.Data, Version=1.6.0.0, Culture=neutral, PublicKeyToken=null/ProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=192.168.250.125\sqlexpress;
initial catalog=Project;
persist security info=True;
user id=***;
password=***;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Why does this work like this? Why would this work in a web project, but not a windows service project?? I recently changed from EF5 to EF6, and this error has popped up - all this code worked previous to upgrading EF. Does anyone have any insight as to why and how/if I can just use * for the dll name in my connection string?
I thought it was an issue of where the service .exe was running and a file wasn't copied locally, but nope, the Project.Data.dll is there and it's the right version.
I used FusionLog to try and find the error, and no luck there. I'm pretty confused.
Why this happens?
The issue you are having is just a result of extra security measures to prevent binary planting or DLL hi-jacking attack (read more) when running your application as as windows service.
Why should I care?
As you probably know, there is a specific, well documented order in what every referenced DLL file is looked up. Usually it starts to search DLL in current application directory and then goes away to more "public" locations like PATH folders, GAC, etc.
Main idea of binary planting is to plant malicious DLL file in a folder which is checked before folder of the legit DLL. Loading such malicious DLL would allow attacker to gain control over the system.
Usually windows services run under elevated account (LocalSystem, LocalService, NetworkService, etc) therefore windows services are good target for binary planting attacks.
What can I do?
Microsoft have taken extra precaution steps to reduce security risks and there is a good reason for that. But you can try to work around you issues.
1) Current directory is not what you expect
Windows service starts in system folder (usually something like C:\Windows\System32)
Good news are that it is very easy to fix. You just have to change current directory on services startup.
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
See blog post from Phil Haack;
2) Read documentation thoroughtly
According to EF documentation, wildcard character has special meaning and it limits places where runtime will look for DLL files:
If you specify a wildcard (*) for assemblyFullName, the Entity
Framework runtime will search for resources in the following
locations, in this order:
1) The calling assembly.
2) The referenced assemblies.
3) The assemblies in the bin directory of an application.
As your working folder is set to system folder and you references probably are not there, EF might end up looking in wrong places and your assemblies containing resources might not be loaded.
3) Stay safe with fully qualified assembly names
Although I am not completely sure about this and haven't tested, but Microsoft just might have disallowed Windows services to load DLL without providing fully qualified assembly name to reduce risk of injecting malicious DLL files;
Good read on securing your Windows services here (specially chapter 5).
4) Debug it!
EF6 happens to be open source project. This means that you can get full source of it and debug it. You can find project on CodePlex here.
Copy the dll containing ProjectEntities to different path and then reference the same in your service project.
I'm afraid I wasn't able to reproduce the error that you received, or answer why you needed to change the metadata.
That said, I did learn that, for the EF connection string, the Windows Service required a different provider connection string than the WebApi did.
The following are the steps to reproduce your error. The only difference is that I'm using localdb not SQLExpress.
The resultant code from my steps-to-reproduce is online at GitHub here: https://github.com/bigfont/EntityFrameworkWindowsServiceWebApi.
Here are those steps:
Create Web API Project
Create ASP.NET Web API 2 Empty Project (MyWebApi)
With NuGet, Install-Package EntityFramework -ProjectName MyWebApi
Add a new ADO.NET Entity Data Model called MyProjectModel.
Add an Entity called Entity1.
Generate the database from the model, calling it MyProject and using localdb.
Run the db creation script on (localdb)\v11.0
Add a new WebApi Controller named ValuesController with a Get method that queries the database.
Test by running in Visual Studio and going to localhost:123456/api/get
See: https://msdn.microsoft.com/en-us/data/jj205424.aspx
Create Windows Service Project
Create Windows Service (MyWindowsService)
Use NuGet, Install-Package EntityFramework -ProjectName MyWindowsService
Add a new ADO.NET Entity Data Model called MyProjectModel.
Add an Entity called Entity1.
Generate the database from the model, calling it MyService, using localdb.
Run the db creation script on (localdb)\v11.0
Add to the OnStart method some code that queries the database.
Add NT AUTHORITY\SYSTEM as a localdb Login and as a MyService db User.
Test by installing, starting, and writing to file:
PowerShell Installation, Startup, and Uninstall
Release> installutil .\MyWindowsService.exe
Release> Start-Service MyService
Release> installutil .\MyWindowsService.exe /u
localdb connection string in the Windows Service
In the connection string for the Windows Service, I wasn't able to use (localdb)\v11.0. Instead, I needed to use the named pipe. I found the named pipe with this command line:
> SqlLocalDB.exe info v11.0
Name: v11.0
Version: 11.0.2100.60
Shared name:
Owner: MY_COMPUTER\Shaun.Luttin
Auto-create: Yes
State: Running
Last start time: 2015-04-09 5:54:34 PM
Instance pipe name: np:\\.\pipe\LOCALDB#1010101\tsql\query
The resultant connection string, using the Instance pipe name, looked like this.
<connectionStrings>
<add name="MyProjectModelContainer"
connectionString="
metadata=
res://*/MyProjectModel.csdl|
res://*/MyProjectModel.ssdl|
res://*/MyProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=np:\\.\pipe\LOCALDB#4BCE6D95\tsql\query;
initial catalog=MyService;
Integrated Security=True;
MultipleActiveResultSets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Whereas the WebApi connection string looked like this:
<add name="MyProjectModelContainer"
connectionString="
metadata=
res://*/MyProjectModel.csdl|
res://*/MyProjectModel.ssdl|
res://*/MyProjectModel.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=(localdb)\v11.0;
initial catalog=MyProject;
integrated security=True;
MultipleActiveResultSets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
See also: http://www.connectionstrings.com/sql-server-2012/
Needing to use a different connection string with a Windows Service that we do with a WebApi project is a similar problem to what you found. From Sql Server Management Studio, from Visual Studio, and from the WebApi, we can connect by calling the data source (localdb)\v.11 whereas from a Web Service we need to call it by it's instance named pipe.
Here's a suspicion: It might be that there are multiple instance of localdb on the computer, and that we needed to absolutely specify which one we want to use. Unfortunately, this doesn't help answer why you needed to change the metadata.
This is a similar though different problem than what you faced, because you needed to change the Entity Framework metadata whereas I needed to change the provider connection string. Coincidence?
Please follow the steps bellow:
1.Write click on edmx file and then click open with of the related entity.
2.Select xml editor and click open.
3.Scroll from top to bottom of the .edmx xml file and look for any error marks.
4.If you mind errors then fix that.
5.Rebuild the solution and if no errors found then congratulations :)

Categories

Resources