首页 > 解决方案 > 创建一个 CompactSql 数据库并将其连接字符串动态添加到实体框架

问题描述

我在 c# WinForms、4.8 .NET Framework 中使用实体 6 工作。

经过更多研究,我发现了一些对我有帮助的东西:

1 - 将此添加到 app.config:

<connectionStrings>
     <add name="DatabaseEntities"
     connectionString="data source=%APPDATA%\writerapp.sdf, Password = 'writerapp'"
     providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>

2 - 在构造函数中更改了我的主表单以调用此方法:

    private void InitializeApp()
    {
        var strCount = ("; Password = 'writerapp'").Length;
        var _conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseEntities"].ConnectionString;
        var _conString = _conStr.Replace("%APPDATA%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
        var _trimToFile = _conString.Remove(_conString.Length - strCount, strCount);

        if (File.Exists(_trimToFile))
        {
            Settings.Default.LocalConString = _conStr;
            Settings.Default.LocalDbPath = _trimToFile;
        }
        else
        {
            SqlCeEngine en = new SqlCeEngine(_conString);
            en.CreateDatabase();

            if (File.Exists(_trimToFile))
            {
                Settings.Default.LocalConString = _conStr;
                Settings.Default.LocalDbPath = _trimToFile;
            }

            else throw new NotImplementedException();
        }

    }

3 - 将我的 DbContext 更改为:

 public class WriterAppContext : DbContext
{
    public WriterAppContext() : base(GetConnectionString()) { }

    private static string GetConnectionString()
    {

        if (!string.IsNullOrEmpty(Settings.Default.LocalConString) 
          && File.Exists(Settings.Default.LocalDbPath)) 
          return Settings.Default.LocalConString;
        else throw new NotImplementedException();
    }

    public DbSet<NotificationHandler> Notifications { get; set; }
}

感谢:连接字符串中的 %APPDATA% 没有替代实际文件夹?

但我得到一个错误:

System.ArgumentException: 'Le format de la chaîne d'initialisation n'est pas conforme à la spécification qui débute à l'index 0.'

表示:初始化链的格式不符合从索引 0 开始的规范。

所以我不知道哪里出了问题?

标签: c#winformsentity-framework-6

解决方案


我终于发现了我的问题:

密码不要求 < ' > 与我所关注的线程的答案相反。另外,我用 < , > 而不是 < ; >

有两个改变:

connectionString="data source=%APPDATA%\writerapp.sdf; Password = writerapp"

   var strCount = ("; Password = writerapp").Length;
   var strCount2 = ("data source=").Length;
   var _conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DatabaseEntities"].ConnectionString;
            var _conString = _conStr.Replace("%APPDATA%", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
            var _cleanPath = _conString.Remove(0, strCount2);
            var _trimToFile = _cleanPath.Remove(_cleanPath.Length - strCount, strCount);

有了这个,问题终于得到了很好的解决。如果我选择任何我想要的位置,这个解决方案也可以工作,因为我用我想要的替换连接字符串。

希望这对其他人有帮助!


推荐阅读