没有App.config的实体框架,数据库优先,存储库模式,N层解决方案体系结构

时间:2018-08-03 07:31:24

标签: c# entity-framework-6 repository-pattern n-tier-architecture

好的,现在我放弃。我的挑战是使用实体框架6,存储库模式和N层解决方案体系结构构建通用DAL。

简介: 使用这种方法https://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework,我创建了DAL和BLL。 一切顺利,Unittests顺利完成。很好。

挑战: 然后,我创建了一个表示层,其中包括一个 Excel插件。但是,由于所使用的数据库可能与每个客户端不同,因此需要从客户端更改数据库ConnectionString。 好的,将应用程序配置添加到Excel模板项目中……不起作用。无论我做什么,我都不会从数据库获得任何数据。

现在,我需要删除app.config,而在初始化BL时只需从客户端提供ConnectionString。

我尝试了Entity Framework - Database First without config的建议 和How can l use Entity Framework without App.config,但我似乎无法完全适应我的挑战。我确实使用了其中提到的一些解决方案,但是由于我的DAL使用的是“存储库模式”,因此我无法完全限制如何实现所提到的解决方案...

我做了什么: 我在DataAccessLayer中添加了一个DbConfiguration类,该类实现了多个构造函数。 (我不知道怎么打其他构造函数-仅参数构造函数,但这是另一个问题。) 我的ythis类构造函数如下:

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,并且试图将我的问题归结为一个问题-稍后还会出现更多问题,但是现在这必须满足...

希望你们中的一些神童能给我一两个指针……

1 个答案:

答案 0 :(得分:0)

好的,我从来没有像我想要的那样工作过,所以我将DomainModel更改为不使用EDMX文件-这是导致我最终错误的全部原因...

基本上,我已经将EF建模从数据库优先更改为代码优先。...

我还将EntityFramework软件包添加到了我的Excel-Addin项目中。