我将DAL从使用LINQ切换到Entity Framework.因为我的应用程序根据当前用户连接到不同的数据库,所以我需要在运行时动态创建DataContext并传入适当的连接字符串.但是,当我尝试使用旧连接字符串以编程方式创建实体框架连接时,连接失败.它抱怨它没有识别连接字符串中的密钥,确切地说是"服务器".
我发现我需要这样做才能使Entity Framework连接正常工作:
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = clientConnectionString;
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl...";
Entities entities = new Entities(entityBuilder.ToString());
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
什么是元数据属性?
对于多个不同的连接,它总是一样的问题吗?
它应该是什么?
有没有办法解决?
提前致谢!
更新1:感谢更新Randolpho,但是......
我遇到此问题的全部原因是我无法将连接字符串存储在配置文件中.连接字符串在运行时由用户连接动态确定.
这是我的确切场景:
如果用户A正在连接,则应用程序从数据库A中提取数据.如果用户B正在连接,则应用程序从数据库B中提取数据.
连接字符串存储在主数据库中,并且该数字可能是无限的.每次添加用户时,我都不想进入web.config,更不用说它最终会变得巨大!
database connection entity-framework connection-string data-access-layer
我有一个ASP.NET应用程序,它使用分层架构,例如表示层,业务逻辑层,数据访问层.
我不希望业务层必须知道有关数据访问层如何实现的任何信息,我不打算使用EntityDataSource或类似的东西将实体直接绑定到数据控件.(所以存储库模式场景)
我只是想将实体框架用作生成类的ORM工具.我知道怎么做.我不清楚的是
我正在使用本机C++创建数据库访问层,我正在寻找支持NULL值的方法.这是我到目前为止:
class CNullValue
{
public:
static CNullValue Null()
{
static CNullValue nv;
return nv;
}
};
template<class T>
class CNullableT
{
public:
CNullableT(CNullValue &v) : m_Value(T()), m_IsNull(true)
{
}
CNullableT(T value) : m_Value(value), m_IsNull(false)
{
}
bool IsNull()
{
return m_IsNull;
}
T GetValue()
{
return m_Value;
}
private:
T m_Value;
bool m_IsNull;
};
Run Code Online (Sandbox Code Playgroud)
这就是我必须定义函数的方法:
void StoredProc(int i, CNullableT<int> j)
{
...connect to database
...if j.IsNull pass null to database etc
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
sp.StoredProc(1, 2);
Run Code Online (Sandbox Code Playgroud)
要么
sp.StoredProc(3, CNullValue::Null());
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有比这更好的方法.特别是我不喜欢CNullValue的单例类对象和静态.我更愿意这样做
sp.StoredProc(3, …Run Code Online (Sandbox Code Playgroud) 我实际上陷入了三层结构.我浏览了互联网,发现了两个术语"数据库抽象层"和"数据访问层".
两者有什么不同?
之前我问过这个问题如何正确单元测试我的DAL?,有一件事对我来说没有答案是,如果真的测试我的DAL是有一个测试数据库,那么模拟与测试数据库的作用是什么?
另外,另一个人建议"在单元测试结束时使用事务和回滚,因此db是干净的",测试db就是.你们怎么看待这个测试+测试DB +事务回滚(所以db不是真正编写的)测试DAL的方法?
为了完整,我的DAL是使用Entity Framework构建的,DB中没有存储过程.由于EF是如此新颖,我真的需要测试DAL以确保它们正常工作.
我不确定在设计程序的数据访问层(DAL)时如何命名数据存储类.
(通过数据存储类,我的意思是一个类,负责将持久化对象读入内存,或者持久保存内存中对象.)
根据两件事命名数据存储类似乎是合理的:
⇒ Banana可以调用加载对象的类,例如BananaSource.
我不知道如何处理第二点(即Source示例中的位).我见过不同的名词显然是出于这个目的使用的:
这些名称是否是任意的,或者每个名称背后是否有广泛接受的含义/语义差异?更具体地说,我想知道:
persistence datasource terminology data-access-layer naming-conventions
关于具有NoSQL数据库的事务脚本,有一个类似的主题,但这一个是关于模式的.从我发现的事务脚本,它根本不是面向对象的.它基本上是程序代码,尽管它可以在其代码的每一行中使用对象.
更好的解决方案是使用域模型,与活动记录或数据映射器相结合,具有工作单元/身份映射/延迟加载/查询对象等.事务脚本可能很容易使用,但它实际上是程序编程,因此应该被视为面向对象世界的反模式.
你怎么看?您是否同意交易脚本是反模式的?或者你真的有办法设计一个面向对象的事务脚本而不是伪装的程序吗?我怀疑这是可能的.
我可能会负责将vb6应用程序移植到c#.此应用程序是一个与访问数据库交互的Windows应用程序.数据访问封装在基本业务对象中.基本上一个表的一个类.现有的vb6业务对象通过DAO读写DB.我以前写了几次DAL和ORM,但它们都只针对SQL Server.这个将需要目标访问和SQL服务器.在以前的项目中,我会将SQL字符串放在业务对象的私有部分中,并可能将冗余的sql代码(如连接,创建命令)移动到公共基类中以减少代码.
这一次,我正在考虑将SQL字符串写入.settings文件或其他键/值类型文本文件.然后我会编写一个sql实用程序来编辑这个文件,并允许我运行并测试参数化查询.这些查询将在业务对象中按名称引用,而不是将sql嵌入到代码中.
我知道一种标准方法是为每个目标数据库创建一个DAL,并具有要使用的DAL配置状态.我真的不想为每个数据库创建两个DAL类.如果我只是通过keyname引用了正确的查询并且具有正确的连接类型,那么似乎代码会更少.
那么,你们这样做吗?你怎么会或者你有没有解决这个问题?什么最适合你?
谢谢!
我有一个存储库层负责我的数据访问,由服务层调用.服务层返回序列化并通过线路发送的DTO.通常,服务只是访问存储库并返回存储库返回的内容.
但要使其工作,存储库必须返回该DTO的实例.否则,您首先必须将存储库返回的数据层对象映射到服务层中的DTO并返回该对象.这看起来很浪费.
最重要的是,如果DTO的创建发生在服务层中,那么在一个存储库调用之前可能已经完成的事情以及因此一个数据库查询现在必须在服务层中的多个存储库调用发生以"组合"最终的DTO.当然,除非我在数据和服务层之间创建一个可以包含这样一个组合对象的传输对象.这则必须映射到DTO.为了纯洁,这似乎是浪费.但是,让存储库层返回仅通过线路发送的对象也是错误的.
我目前正在试验MongoDB.我正在从NHibernate/SQL思维模式转向,所以最初我实现了一个用于数据访问的存储库模式.
在我开始使用嵌套文档之前,这一切都很好看.现在看起来似乎有点不匹配.但是,我对存储库感到满意,并且喜欢它们提供的抽象,关注点分离和可测试性.
人们是否成功使用存储库模式和文档数据库?如果没有,您使用什么数据访问方法?那么抽象/ SoC呢?
c# ×2
orm ×2
.net ×1
3-tier ×1
asp.net ×1
c++ ×1
connection ×1
data-access ×1
database ×1
datasource ×1
dbal ×1
dto ×1
mocking ×1
nosql ×1
nullable ×1
persistence ×1
sql ×1
terminology ×1
unit-testing ×1
winforms ×1