Entity Framework 没有 App.config,数据库优先,存储库模式,N 层解决方案架构
Entity Framework without App.config, Database first, Repository Pattern, N-tier Solution Architecture
好吧,那我放弃了。我的挑战是使用 Entity Framework 6、存储库模式和 N 层解决方案架构构建通用 DAL。
剧情简介:
使用这种方法 https://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework,我创建了我的 DAL 和 BLL。
一切顺利,单元测试顺利完成。不错
挑战:
然后我创建了一个表示层,其中包括一个 Excel AddIn。但由于使用的数据库可能与每个客户端不同,因此需要从客户端更改数据库 ConnectionString。
好的,将应用程序配置添加到 Excel-template 项目……不起作用。无论我做什么,我都没有从数据库返回任何数据。
现在我需要消除对 app.config 的需求,而只是在初始化 BL 时从客户端提供 ConnectionString。
我尝试了 Entity Framework - Database First without config 的建议
和 How can l use Entity Framework without App.config,但我似乎无法让它很好地适应我的挑战。我确实使用了其中提到的一些解决方案,但由于我的 DAL 使用的是存储库模式,所以我无法完全了解如何实施所提到的解决方案...
我做了什么:
我在DataAccessLayer中添加了一个DbConfiguration-class,实现了多个构造函数。 (我无法弄清楚如何命中其他构造函数 - 只有 parameterles 构造函数,但这是另一个问题的问题)。
我的 ythis classe 构造函数如下所示:
private DefaultConfiguration()
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder()
{
DataSource = database,
InitialCatalog = initialCatalog,
UserID = userId,
Password = password,
IntegratedSecurity = useTrustedConnection
};
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder()
{
Provider = providerName,
// Set the provider-specific connection string.
ProviderConnectionString = sqlBuilder.ToString(),
// Set the Metadata location.
Metadata = @"res://*/CommonModel.csdl|res://*/CommonModel.ssdl|res://*/CommonModel.msl"
};
SetExecutionStrategy("System.Data.SqlClient", () => new DefaultExecutionStrategy(), database);
}
EntityConnection entityCon = new EntityConnection(entityBuilder.ToString());
//SetDefaultConnectionFactory(new SqlConnectionFactory(entityCon.ConnectionString));
//SetDefaultConnectionFactory(new SqlConnectionFactory(sqlBuilder.ToString()));
我似乎无法弄清楚如何在 DbConfiguration 的初始化中使用我的 EntityConnection 对象。最后两行代码似乎都没有正常工作。
在我的 DbContext 中,我将构造函数从
更改为
public CommonEntities()
: base("name=CommonEntities")
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
至
public CommonEntities(string ConnectionString)
: base(ConnectionString)
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
不过,这只会引发可怕的 UnIntentionalCodeFirstException,我现在被卡住了。
问题:
如何从我的 PL 一直到 DAL 获取 ConnectionString?我会尝试创建一个非无参数的 Repository-constructor,它会接受一个 SQL-sonnectionstring 作为参数,但是如何呢?
我知道这是一个很大的问题,但我已尝试在不导致 SystemOutOfMemoryException 的情况下提供尽可能多的信息,并尝试将我的问题归结为一个问题 - 稍后会出现更多问题,但对于现在这就足够了……
希望各位大侠指点一二……
好的,我从来没有像我想要的那样工作,所以我将我的 DomainModel 更改为不使用 EDMX 文件 - 这是我得到的最终错误的全部原因......
基本上我已经将 EF 建模从数据库优先更改为代码优先....
我还在我的 Excel-Addin 项目中添加了 EntityFramework 包。
好吧,那我放弃了。我的挑战是使用 Entity Framework 6、存储库模式和 N 层解决方案架构构建通用 DAL。
剧情简介: 使用这种方法 https://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework,我创建了我的 DAL 和 BLL。 一切顺利,单元测试顺利完成。不错
挑战: 然后我创建了一个表示层,其中包括一个 Excel AddIn。但由于使用的数据库可能与每个客户端不同,因此需要从客户端更改数据库 ConnectionString。 好的,将应用程序配置添加到 Excel-template 项目……不起作用。无论我做什么,我都没有从数据库返回任何数据。
现在我需要消除对 app.config 的需求,而只是在初始化 BL 时从客户端提供 ConnectionString。
我尝试了 Entity Framework - Database First without config 的建议 和 How can l use Entity Framework without App.config,但我似乎无法让它很好地适应我的挑战。我确实使用了其中提到的一些解决方案,但由于我的 DAL 使用的是存储库模式,所以我无法完全了解如何实施所提到的解决方案...
我做了什么: 我在DataAccessLayer中添加了一个DbConfiguration-class,实现了多个构造函数。 (我无法弄清楚如何命中其他构造函数 - 只有 parameterles 构造函数,但这是另一个问题的问题)。 我的 ythis classe 构造函数如下所示:
private DefaultConfiguration()
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder()
{
DataSource = database,
InitialCatalog = initialCatalog,
UserID = userId,
Password = password,
IntegratedSecurity = useTrustedConnection
};
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder()
{
Provider = providerName,
// Set the provider-specific connection string.
ProviderConnectionString = sqlBuilder.ToString(),
// Set the Metadata location.
Metadata = @"res://*/CommonModel.csdl|res://*/CommonModel.ssdl|res://*/CommonModel.msl"
};
SetExecutionStrategy("System.Data.SqlClient", () => new DefaultExecutionStrategy(), database);
}
EntityConnection entityCon = new EntityConnection(entityBuilder.ToString());
//SetDefaultConnectionFactory(new SqlConnectionFactory(entityCon.ConnectionString));
//SetDefaultConnectionFactory(new SqlConnectionFactory(sqlBuilder.ToString()));
我似乎无法弄清楚如何在 DbConfiguration 的初始化中使用我的 EntityConnection 对象。最后两行代码似乎都没有正常工作。
在我的 DbContext 中,我将构造函数从
更改为public CommonEntities()
: base("name=CommonEntities")
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
至
public CommonEntities(string ConnectionString)
: base(ConnectionString)
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
不过,这只会引发可怕的 UnIntentionalCodeFirstException,我现在被卡住了。
问题:
如何从我的 PL 一直到 DAL 获取 ConnectionString?我会尝试创建一个非无参数的 Repository-constructor,它会接受一个 SQL-sonnectionstring 作为参数,但是如何呢?
我知道这是一个很大的问题,但我已尝试在不导致 SystemOutOfMemoryException 的情况下提供尽可能多的信息,并尝试将我的问题归结为一个问题 - 稍后会出现更多问题,但对于现在这就足够了……
希望各位大侠指点一二……
好的,我从来没有像我想要的那样工作,所以我将我的 DomainModel 更改为不使用 EDMX 文件 - 这是我得到的最终错误的全部原因......
基本上我已经将 EF 建模从数据库优先更改为代码优先....
我还在我的 Excel-Addin 项目中添加了 EntityFramework 包。