2015-11-06 97 views
4

首先,让研究摆脱困境。我已经在这里看到并应用了这个问题的答案:Web Deploy/Publish is adding a unknown connection string?Web部署添加额外的连接字符串(两次添加相同的连接)

它不起作用,我的意思是,它对我面临的问题没有任何影响。

另一个可能有用的信息是我正在使用Visual Studio 2015 Enterprise。

好吧,现在我面临的问题是一个奇怪的问题。我在我的web.config文件中有两个数据库连接。他们是这样定义的:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Test.mdf;Initial Catalog=Test;Integrated Security=True" providerName="System.Data.SqlClient" /> 
<add name="ErpConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Test.mdf;Initial Catalog=Test;Integrated Security=True" providerName="System.Data.SqlClient" /> 

DefaultConnection相关的背景是ApplicationDbContext。与ErpConnection相关的上下文是ErpEntityContext。这些每一个被定义是这样的:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("name=DefaultConnection") 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
} 

和:

public class ErpEntityContext : DbContext 
{ 
    public ErpEntityContext() 
     : base("ErpConnection") 
    { 
    } 
} 

然而,网络部署决定ApplicationDbContextDefaultConnection必须是两个完全不同的东西,所以最终显示他们像在两种不同的连接下图:

enter image description here

从卸下摆脱了双重入口(这显然不是解决方案,因为我想让我的连接字符串)。更改连接字符串的名称完全不重要。这也不会发生在ErpConnection

这发生在Visual Studio的一个会话到另一个会话,并且昨天从无处出现。然后几个小时后,当我重新启动VS时,它会自动消失。我认为它是固定的,一切都很华丽,但今天它又重新出现了。我完全失去了这里可能会出错的地方。尽管我对解决方案感兴趣,但如果有人能告诉我为什么会发生这种情况,我也会很感激。

编辑:

为了澄清和回答在评论中提出的问题,我没有指定的任何转换,问题出现在所有生成配置。

此外,我试图发布与Remove additional files at destination选中和未选中。同样,我试图发布与Exclude files from the App_Data folder检查和取消选中,看看我是否可以愚弄的东西(:))。但迄今为止无济于事。

UPDATE:

问题的进一步调查发现,罪魁祸首可能是DbConfiguration使用Loaded事件:

Loaded += (sender, args) => args.ReplaceService<DbProviderServices>((s, _) => new CachingProviderServices(s, transactionHelper, new ExampleCachingPolicy())); 

此事件的文件说:

构建DbConfiguration后,在EF初始化期间发生 构造编辑,但就在它被锁定准备使用之前。使用此事件 检查和/或覆盖在配置锁定之前已注册的服务 。请注意,此事件应谨慎使用 ,因为它可能会阻止工具发现在运行时使用的相同 配置。

问题是如果需要使用此事件,修复将会是什么。如果我找到一个答案,我会写一个答案,但如果有其他人知道,请随时这样做。

+0

您的意图是两个连接字符串是否相同?另外,你有没有指定任何转换(你可以扩展你的.config文件,看到子节点)?最后,这个问题是否适用于所有构建配置,只是调试等? – Basic

+0

@Basic是的,这是正确的。但是,将这些字符串更改为不同的结果具有相同的结果。一个连接会显示两次,并在发布时出现混乱。 –

+1

@基本感谢您的提问,我更新了问题以澄清情况。但总而言之,没有任何改变,并且在所有情况下都会发生。 –

回答

1

经过长时间的研究和实验,我终于找到了一种摆脱双重入口的方法:给你的connectionString和你的Context相同的名字!

因此,要回答这个问题,将连接字符串DefaultConnection重命名为ApplicationDbContext应删除该重复条目。请注意,您还需要更新与新的连接字符串名称如下:

public ApplicationDbContext() 
    : base("name=ApplicationDbContext") 

可悲的是,虽然,我决定离开它,因为它是(与复式),因为它给我的可能性使用Execute Code First migrations (runs on application start)Update database更新数据库。

使用Update database的优点是您可以在架构更新之前和之后运行自定义SQL脚本。

+0

Wen你改了名字,你是不是也在这行改了呢'''''''''''''''''''据我所知,迁移将使用无参数的构造函数。 – IvanGrasp

+0

是的,我做到了。虽然我们的代码使用appSetting来定义要使用的连接字符串名称,所以我只需更新正确的appSetting。我没有完全测试它,但应用程序似乎正常工作。 – Alexandre

+0

我的某个项目遇到了一些问题。根据您的应用程序的启动方式,它可能会从另一个文件读取配置。例如,将MVC项目设置为“StartUp Project”的解决方案中的EF项目将从Web.config中读取appSetting,而不是从app.config中读取appSetting。 – IvanGrasp