c# - 创建一个 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 开始的规范。
所以我不知道哪里出了问题?
解决方案
我终于发现了我的问题:
密码不要求 < ' > 与我所关注的线程的答案相反。另外,我用 < , > 而不是 < ; >
有两个改变:
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);
有了这个,问题终于得到了很好的解决。如果我选择任何我想要的位置,这个解决方案也可以工作,因为我用我想要的替换连接字符串。
希望这对其他人有帮助!
推荐阅读
- mysql - Diesel 的声明性模式定义
- python - 在类中取消持久化数据帧(pyspark)
- c - 是否可以使用
和 在 c 中读取单词之间有空格的参数? - node.js - 如何在退出时删除购物车项目
- azure - 执行 Azure DevOps 构建管道时 - 收到消息:此管道需要访问资源的权限才能继续
- kubernetes - 在本地公司服务器上的 k8s 3 节点集群中面临 imagepullbackoff 错误
- google-apps-script - 根据两个或多个条件从谷歌表格发送电子邮件
- minikube - containerd-shim的父进程是什么进程?
- tensorflow - tf.print 不做任何事情,即使它是图表的一部分
- node.js - 如何验证字符串值是否为有效日期?