Entity Framework的连接字符串纯粹就是毛线
有一种扯淡叫做毛线。
.NET的实体框架当前已经是4.1了,考虑到已经提供POCO功能,并且还支持多种数据库(这点可是Linq2Sql无法做到的),于是想试试。
不可否认,EF强大的设计能力确实很方便。但是很困惑的地方就是在Sql Server 2008下,DateTime类型在数据库中只能使用datetime2,否则运行后会报错,据说Sql Server 2005就没这个问题,当然2005中也没有这种类型。
一切都很顺利,直到有天想把现有网络版的软件转换成单机版的软件,问题就来了。
原本打算是使用DB4O来进行单机数据存储,但需要实现相应的UnitOfWork和Repository,又想到EF是支持多数据库的,换成SQLCE不就行了,都是一家人,相互认识是必然的。修改下连接字符串吧,NHiberate可不就是这样的嘛!
于是很自信地修改了下连接字符串,没想到还真出了问题。首先系统提示连接字符串有问题,折腾了一半天,原来在设计器的edmx文件中有和当前连接的数据库类型相关的信息,还必须通过XML设计器打开该文件进行修改;修改后又出现问题,提示SQL CE中不支持datatime2类型,猜到是映射的问题,又使用XML设计器打开文件手动逐一修改,同时还发现SQL CE中支持的字符串长度还不能超过4000,所有字符串超过4000的也会提示错误。
找到了原因,又想到系统需要同时支持单机版和网络版,为了提高系统的灵活性,索性复制了一个edmx,然后配置其为SQL CE类型的数据库才解决问题。没有想到EF居然是以这种方式支持多数据库的,真是BT啊。
总觉得这种解决方式有问题,搜索了一下,也找到了相应的解决办法:
http://mosesofegypt.net/post/Multiple-database-support-with-Entity-Framework.aspx,
不过还是得使用XML编辑器打开edmx文件进行手动修改,还是得添加相应的提供者类型和字段映射定义。一想到如果结构有变化我就后怕,岂不是每次都要手动重复做这番工作?这点可比NHiberate差远了。
在此终于恍然大悟,终于搞清楚EF的连接字符串为什么必须包含metadata的定义。如果要在运行时更换数据库,那么metadata的定义就必不可少,因为在其中还包含了不同数据库相关的提供者信息和字段映射信息。
真没想到EF是以这种方式实现多数据库的支持的,原来支持和自动支持是有很大差距的。
唉,真是......
不知啥时能像NHiberate一样自动支持多数据库的ORM呢?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端