c# – Web Deploy添加额外的连接字符串(两次添加相同的连接)

首先,让研究取消.我已经在这里看到并应用了这个问题的答案: Web Deploy / Publish is adding a unknown connection string?

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

另一条可能有用的信息是我正在使用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")
    {
    }
}

但是,Web部署决定ApplicationDbContext和DefaultConnection必须是两个非常不同的东西,所以最终将它们显示为两个不同的连接,如下图所示:

《c# – Web Deploy添加额外的连接字符串(两次添加相同的连接)》

从web.config中删除DefaultConnection可以摆脱双重条目(这显然不是解决方案,因为我希望连接字符串).更改连接字符串的名称根本不重要. ErpConnection也不会发生这种情况.

这发生在Visual Studio的一个会话到另一个会话中,昨天突然出现了.几个小时后,当我重新启动VS时,它会自动消失.我认为这是固定的,一切都是花花公子,但今天又重新出现了.我完全迷失了这里可能出现的问题.尽管我对解决方案感兴趣,但如果有人能告诉我为什么会这样,我也会感激不尽.

编辑:

为了澄清和回答评论中提出的问题,我没有指定任何转换,并且问题出现在所有构建配置中.

另外,我尝试使用删除目的地中的删除其他文件来检查和取消选中.同样,我试图发布App_Data文件夹中的Exclude文件选中并取消选中,以查看我是否可以欺骗(:)).但到目前为止无济于事.

更新:

对该问题的进一步调查表明,罪魁祸首可能是在DbConfiguration中使用Loaded事件:

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

此活动的文档说:

Occurs during EF initialization after the DbConfiguration has been
constructed but just before it is locked ready for use. Use this event
to inspect and/or override services that have been registered before
the configuration is locked. Note that this event should be used
carefully since it may prevent tooling from discovering the same
configuration that is used at runtime.

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

最佳答案 经过长时间的研究和实验,我终于找到了摆脱双重条目的方法:给你的connectionString与你的Context同名!

因此,要回答这个问题,将连接字符串DefaultConnection重命名为ApplicationDbContext应删除double条目.请注意,您还需要使用新的连接字符串名称更新以下内容:

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

可悲的是,我决定保留它(使用双条目),因为它使我可以使用Execute Code First迁移(在应用程序启动时运行)或更新数据库来更新数据库.

使用Update数据库的优点是可以在Schema更新之前和之后运行自定义SQL脚本.

点赞