Web部署添加额外的连接字符串(两次添加相同的连接)

时间:2015-11-06 17:44:52

标签: c# asp.net-mvc visual-studio-2015 webdeploy

首先将研究排除在外。我在这里已经看到并在这个问题的答案中应用了解决方案: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")
    {
    }
}

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

enter image description here

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

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

修改

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

另外,我尝试在Remove additional files at destination已选中和未选中的情况下发布。同样,我试图发布Exclude files from the App_Data folder已选中和未选中,以查看我是否可以欺骗(:))。但到目前为止无济于事。

更新

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

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

此活动的文档说:

  

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

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

1 个答案:

答案 0 :(得分:1)

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

因此,要回答这个问题,将连接字符串# -*- mode: python -*- from kivy.deps import sdl2, glew block_cipher = None a = Analysis(['demoplayer.py'], pathex=['C:\\Users\\Jesse\\reflv01'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, exclude_binaries=True, name='demoplayer', debug=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, Tree("C:\\Users\\Jesse\\reflv01"), *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)], strip=False, upx=True, name='demoplayer') 重命名为DefaultConnection应删除双重条目。请注意,您还需要使用新的连接字符串名称更新以下内容:

ApplicationDbContext

可悲的是,我决定保留原样(带有双重条目),因为它让我可以使用public ApplicationDbContext() : base("name=ApplicationDbContext") Execute Code First migrations (runs on application start)来更新数据库。

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