I am using Entity Framework 4 with my Asp.Net MVC3 application. My problem is that I am using Entity Framework to perform action with my database , That is working fine. For some other purpose I am also using Sql Connection to Store and Retrieve my data from database. I am getting
[Keyword not supported: 'metadata']
error while connecting with my database.
This is my web config
<add name="VibrantEntities" connectionString="metadata=res://*/Vibrant.csdl|res://*/Vibrant.ssdl|res://*/Vibrant.msl;provider=System.Data.SqlClient;provider connection string="data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
I am using class Library, So this is my App Config.
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add name="VibrantEntities" connectionString="metadata=res://*/Vibrant.csdl|res://*/Vibrant.ssdl|res://*/Vibrant.msl;provider=System.Data.SqlClient;provider connection string="data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
The connection string for ADO.NET (in this case SqlConnection
) doesn't take that format. You're using the one specific for Entity Framework. The ADO.NET one should be something like:
"data source=KAPS-PC\KAPSSERVER;initial catalog=vibrant;integrated security=True"
So, to sum it up, you need two separate connection strings, one for EF and one for ADO.NET
You connection string is specific to Entity Framework and contains metadata. You need to get your provider connection string from it. You can do it using EntityConnectionStringBuilder
:
var efConnectionString = "Your Entity Framework connection string";
var builder = new EntityConnectionStringBuilder(efConnectionString);
var regularConnectionString = builder.ProviderConnectionString;
Another option (other than 2 separate connection strings for the same thing) is to build a method that returns an ADO.NET connection string from your Entity Framework object:
using System.Data.EntityClient;
using System.Data.SqlClient;
...
private string GetADOConnectionString()
{
SalesSyncEntities ctx = new SalesSyncEntities(); //create your entity object here
EntityConnection ec = (EntityConnection)ctx.Connection;
SqlConnection sc = (SqlConnection)ec.StoreConnection; //get the SQLConnection that your entity object would use
string adoConnStr = sc.ConnectionString;
return adoConnStr;
}
(I place this somewhere in my Class Library where my edmx files are)
(I got this from http://justgeeks.blogspot.com/2009/11/getting-sqlconnection-from.html)
Or even better... if your SQLConnection stuff are manual SQL queries, skip the SQLConnection entirely via the ExecuteStoredCommand:
new AdventureEntities().ExecuteStoreCommand(
@" UPDATE Users
SET lname = @lname
WHERE Id = @id",
new SqlParameter("lname", lname), new SqlParameter("id", id));
(I got this from Entity Framework getting an sql connection)
Theres a better solution here, use the Entity Framework Power tools, reverse engineer your database into your project, then you can use a single EF connection string (which is a normal connection string) for both scenarios.