EF 5 + SQL Server CE 4:如何为数据库文件指定自定义位置?

Jak*_*ner 7 c# entity-framework sql-server-ce

我正在开发一个需要一个小型本地数据库的客户端系统.我想避免安装SQL Server Express,并决定使用SQL Server 4.

我使用Entity Framework 5进行数据访问,并创建了自定义上下文.在开发中一切正常,我可以使用app.config设置特定的文件位置或动态Data Source=|DataDirectory|\MyDatabase.sdf.

但在部署时,我希望数据库位于users documents文件夹中:

\My Documents\ApplicationName\MyDatabase.sdf
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我只需要能够在代码中设置自定义连接字符串!

这是我到目前为止所尝试的:

private MyApplicationDataContext(string connectionString)
    : base(connectionString)
{
}

public static MyApplicationDataContext CreateInstance()
{
    var directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    var path = Path.Combine(directory, @"ApplicationName\MyDatabase.sdf");

    //var connectionString = string.Format("provider=System.Data.SqlServerCe.4.0;provider connection string=\"Data Source={0}\"", path);
    var connectionString = string.Format("Data Source={0}", path);

    return new MyApplicationDataContext(connectionString);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我尝试了两种连接字符串,但都导致异常.

不支持关键字:'provider'.

提供程序未返回ProviderManifestToken字符串.

Jak*_*ner 10

啊,我终于做对了!

如果其他人有同样的问题,我会包含调整后的代码.诀窍是在Database.DefaultConnectionFactory上设置连接字符串

    private MyApplicationDataContext()
    { }

    public static MyApplicationDataContext CreateInstance()
    {
        var directory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        var path = Path.Combine(directory, @"ApplicationName\MyDatabase.sdf");

        // Set connection string
        var connectionString = string.Format("Data Source={0}", path);
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0", "", connectionString);

        return new MyApplicationDataContext();
    }
Run Code Online (Sandbox Code Playgroud)