Connect to Sqlite database at run time using entity framework - c#

I want to connect my project to an Sqlite database. So, in my Database Context I have this cunstructor and an Initialize method
private DatabaseContext(string cnxString) : base(cnxString)
{
Database.SetInitializer<DatabaseContext>(new DatabaseInitialiser());
}
public static void initialize(string connx)
{
_instance = new DatabaseContext(connx);
}
and In the program.cs I call Inialize method to set the connexion string
DatabaseContext.initialize("data source=D:\storage.sqlite;");
So, every user can connect to his database by passing his connexion string.
But, when running my application I have this error :
An error occurred while getting provider information from the database. This can be caused by Entity Framework using an incorrect connection string. Check the inner exceptions for details and ensure that the connection string is correct.

You'll need to pass in a SQLite connection object to the base constructor:
private DatabaseContext(string cnxString)
: base(new SQLiteConnection(cnxString), contextOwnsConnection: true)
{
}

Related

How to create a DbContext instance of the specified database type

I know that the default return here is the SQL Server database type, but I need the MySQL database type, the problem is to create a DbContext instance of the specified database type?
Of course, I know that it can also be created by specifying the connectionName, but the database connection string is encrypted and the string needs to be decrypted
The pseudo code is as follows:
public partial class MyDbContext : DbContext
{
static string mysqlConn = ReadConnectionString(); //Get the encrypted MySQL connection string
public MyDbContext() : base(mysqlConn)
{
// Even if I want to modify the connection string in this way, nor will it throw a connection string malformed exception
Database.Connection.ConnectionString = DecryptConnectionString(mysqlConn);
}
}
Ok, it's about what I expected, few of my questions can be answered.
Although I am not too familiar with EntityFramework, by looking at the source code of DbContext, I can almost certainly determine that this is a design flaw, it lacks a constructor like this:
Public DbContext(string connectionString, string providerName)
I had same problem and found .Net framework 4.5 needs additional attribute on DbContext class to use MySql as below
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MySqlContext : DbContext
{
...
}

Entity Framework MySQL DbContext cannot connect

I created a models using code-first and without storing password in App.config, I passing it in constructor of DbContext instead:
public TasksWithoutPasswordContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
this.Database.Connection.ConnectionString = nameOrConnectionString;
}
But I got a runtime error while trying to get DbSet of my DbContext:
using (TasksWithoutPasswordContext contextWithoutPassword = new TasksWithoutPasswordContext(connectionString))
{
foreach (var user in contextWithoutPassword.users)
{
MessageBox.Show(user.user);
}
}
Additional information: 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 tried to mark my class as next:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class TasksWithoutPasswordContext : DbContext
and it didn't helped.
As you already found the solution yourself, I add the answer:
When you're inheriting from DbContext and call the base constructor, you could use the default-base-constructor (the parameterless one) and set the connectionstring in constructor:
public TasksWithoutPasswordContext(string nameOrConnectionString) : base()
{
this.Database.Connection.ConnectionString = nameOrConnectionString;
}

Code First always wants to create new database when deploying to another PC

i have a win-form app that uses CodeFirst to work with data.
after creating database from my models i have imported records to it from another database.it works fine in my PC but when i deploy my app to another pc, codefirst tries to create new database and throws this error :
System.Data.Entity.Core.EntityException: The underlying provider failed on Open. --->
System.Data.SqlClient.SqlException: Cannot create file
'E:\New folder (2)\Release\MyDB_log.ldf' because it already exists.
Change the file path or the file name, and retry the operation.
Could not open new database 'MyDB'. CREATE DATABASE is aborted.
Cannot attach the file 'E:\New folder (2)\Release\MyDB.mdf' as database 'MyDB'.
connection string :
<connectionStrings>
<add name="AppDbContext"
connectionString="Server=.\sqlexpress;AttachDbFilename=|DataDirectory|\MyDB.mdf;Database=MyDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>
AppDbContext :
public class AppDbContext :DbContext
{
static AppDbContext() {
Database.SetInitializer<AppDbContext>(null);
}
public DbSet<Stock> Stocks { get; set; }
public DbSet<Report> Reports { get; set; }
}
Migration class:
internal sealed class Configuration : DbMigrationsConfiguration<Sita_Election.DAL.AppDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "Sita_Election.DAL.AppDbContext";
AutomaticMigrationDataLossAllowed = false;
}
protected override void Seed(Sita_Election.DAL.AppDbContext context)
{
}
}
so i want to use existing database that is created in development with codefirst,how can i do this ?
Is there any reason to have a database per application?
I would suggest using just a SQL DB if possible.
Thanks,
Phill
Your connection string is using a trusted connection so your IIS user is going to need access to that file or you could switch to a sql login. http://th2tran.blogspot.com/2009/06/underlying-provider-failed-on-open.html

System.data.SQLite entity framework code first programmatic providername specification

I've spent a while on this now and have only found a workaround solution that I'd rather not do...
I have a context as shown below. Is there a programmatic way to specify the database to connect to via the constructor, and get it to use the System.Data.SQLite entity framework provider to connect to a SQLite database? This is working via the app.config (with a connectionstring called "Context"), but not via any programmatic way I can find of supplying it. I have tried using an entity connectionstring builder and that produces the following string:
provider=System.Data.SQLite;provider connection string='data
source="datafile.db"'
When the context is first queried with this string I get a message "Keyword not supported: 'provider'."
public class Context : DbContext
{
public IDbSet<Test> Tests { get; set; }
public Context()
: base("Context")
{
}
}
*Edit.
I may have solved this by implementing my own connectionfactory:
public class ConnectionFactory : IDbConnectionFactory
{
public DbConnection CreateConnection(string nameOrConnectionString)
{
return new SQLiteConnection(nameOrConnectionString);
}
}
Then setting:
Database.DefaultConnectionFactory = new ConnectionFactory();
However, it seems like there should be a built in way to do this, and also one that does not involve overriding the global default connection factory.

How to use dynamic connection string for SQL Server CE?

I used SQL Server CE 4.0 in my windows app and use Entity Framework to create a model of it.
It works fine but my problems is that it doesn't have a constructor to change the connection string, and by default it reads the connection string from the app.config file.
using (var Context = new MyEntitiesModel(//has no constructor))
{
...
}
I create a dynamic connection string and
using (var Context = new MyEntitiesModel())
{
Context.Database.Connection.ConnectionString = entityConnection.ConnectionString;
}
It works fine by this way but if I remove another connection string in app.config file it gave me this.
error = invalid metasource ....
because the default constructor uses it
How can I handle it?
Create your own constructor. MyEntitiesModel is partial class you can add your own partial part of the class and add constructor accepting a connection string.
public partial class MyEntitiesModel {
public MyEntitiesModel(string connectionString) : base(connectionString) { }
}
Im using DbContext. There are several Overload Constructors eg:
ObjectContext also has a similar set of constructor overloads.
System.Data.Entity DbContext example
Context = new BosMasterEntities(nameOrConnectionString: nameOrConnectionString);
You can connect to multiple Dbs at same time.

Categories