首先将研究排除在外。我在这里已经看到并在这个问题的答案中应用了解决方案: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")
{
}
}
但是,网络部署决定ApplicationDbContext
和DefaultConnection
必须是两个非常不同的东西,所以最终将它们显示为两个不同的连接,如下图所示:
从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初始化期间发生 在锁定准备好使用之前构建。使用此活动 检查和/或覆盖之前已注册的服务 配置已锁定。请注意,应使用此事件 小心,因为它可能会阻止工具发现相同的 在运行时使用的配置。
问题是如果需要使用此事件,将会有什么修复。如果我找到答案,我会写一个答案,但如果有其他人知道,请随意这样做。
答案 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脚本。