H. Pauwelyn
H. Pauwelyn

Reputation: 14280

Connection string for Entity Framework in an Azure Function

I'm creating an Azure Function and I've added a reference to a project that uses Entity Framework. I've copied the connection string from that project and pasted in the local.settings.json file inside the ConnectionStrings object as a valid EF connection string.

metadata=res://*/xxx.csdl|res://*/xxx.ssdl|res://*/xxx.msl;
provider=System.Data.SqlClient;
provider connection string=&quote;
    data source=xxx;
    initial catalog=xxx;
    user id=xxx;
    password=xxx;
    MultipleActiveResultSets=True;
    App=EntityFramework
&quote;

But it's given me this exception:

Keyword not supported: metadata.


If I use a valid SQL connection string (like below),

data source=xxx;
initial catalog=xxx;
user id=xxx;
password=xxx;
MultipleActiveResultSets=True;
App=EntityFramework

I've this exception:

The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development. This will not work correctly. To fix this problem do not remove the line of code that throws this exception. If you wish to use Database First or Model First, then make sure that the Entity Framework connection string is included in the app.config or web.config of the start-up project. If you are creating your own DbConnection, then make sure that it is an EntityConnection and not some other type of DbConnection, and that you pass it to one of the base DbContext constructors that take a DbConnection. To learn more about Code First, Database First, and Model First see the Entity Framework documentation here: http://go.microsoft.com/fwlink/?LinkId=394715


How could I create a connection to my database in an Azure function using Entity Framework? I'm using .NET framework and for EF I'm using database first.


I'm init my database context as follow:

using (XxxDB db = new XxxDB()) 
{ }

Meanwhile, I've created an overload for the contrustor XxxDB

public XxxDB(string connectionString): base(new EntityConnection(connectionString), true)
{ }

And pass the SQL connection string when creating the XxxDB and got this error:

Keyword not supported: data source.

Upvotes: 1

Views: 2746

Answers (1)

reckface
reckface

Reputation: 5858

Ok, this is caused by how EF model first connection strings are generated. The EF connection string builder requires a plain connection string in the constructor. Then you add the metadata section for model first.

When you create new connection string to pass to a DB context string builder, change this:

public XxxDB(string connectionString): base(new EntityConnection(connectionString), true)
{ }

to

public XxxDB(string connectionString): base(GetEntityConnection(connectionString), true)
{ }

private static string GetEntityConnection(string connectionString)
{
    var efConnection = new EntityConnectionStringBuilder();
    efConnection.ProviderConnectionString = connectionString;
    // res://*/xxx.csdl|res://*/xxx.ssdl|res://*/xxx.msl
    var model = "xxx";
    // this is what's missing in your question
    efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model);
    return efConnection.ConnectionString;
}

Upvotes: 2

Related Questions