使用LocalDB与Service Fabric

15

我有一个Actor,当从WebAPI项目接收到请求时,该Actor使用Entity Framework 6查询一个表。

using (var context = new MetadataContext())
{
    var userStorageAccountId = context.Set<UsersToStorageAccounts>()
                                      .Find(userId).StorageAccountId;
}

使用 "Add-Migration" .. "Update-Database" 命令成功创建了DB,并具有以下连接字符串:

@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFileName=C:\Users\xxxx\Metadata.mdf;Connect Timeout=30;Initial Catalog=Metadata;Integrated Security=True;"
当我运行织物服务并且角色尝试访问上下文时,我会收到以下异常:
“在建立到 SQL Server 的连接时发生与网络或特定实例相关的错误。找不到服务器或无法访问。请验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供程序:SQL Network Interfaces,错误:50 - 发生本地数据库运行时错误。无法创建自动实例。有关错误详细信息,请参阅 Windows 应用程序事件日志。)”
并且事件查看器中的错误是:
“无法获取本地应用程序数据路径。很可能未加载用户配置文件。如果在 IIS 下执行 LocalDB,请确保为当前用户启用了配置文件加载。”
我寻找了一种加载用户配置文件的方法,但我只找到了针对 IIS 的解决方案。
请帮忙 :)

1
使用Service Fabric的整个目的是轻松部署,无需关心服务器。LocalDB(一种在进程中存储数据的数据库)意味着您实际上想要修改服务器并与其绑定,因为如果不失去数据,您将无法移动到另一台机器。而且,您的代码使用指向特定用户文件夹的db路径。 - Panagiotis Kanavos
5
LocalDB 仅用于调试。如果服务部署在开发环境下,则使用 LocalDB,如果在生产环境下运行,则使用 mssql server 数据库。由于调试目的,我无法在本地使其工作。 - shlatchz
1
如果你不想使用它,那就别用。Service Fabric即使在本地也不能在你的账户下运行,因此不能访问你的用户目录。实际上,错误表明Service Fabric是在一个不允许加载配置文件的账户下运行的,即没有配置文件,也没有用户目录。为什么要使用LocalDB呢,而不是安装SQL Server的本地版本?开发版是免费的。 - Panagiotis Kanavos
4
@PanagiotisKanavos,我宁愿采用轻量级的解决方案,而不是安装SQL Express......如果不行,那我想我只能使用它了。 - shlatchz
3
@PanagiotisKanavos 我实际上尝试指定数据库的位置,但仍然抛出相同的异常。 - shlatchz
显示剩余2条评论
2个回答

27

由于Service Fabric在其他用户下运行,因此需要共享数据库并授予NETWORK SERVICE权限:

  1. 使用SqlLocalDB.exe命令行分享您的连接,发出此命令:

    sqllocaldb share MSSqlLocalDB SharedDB
    
  2. 使用 SQL Server Management Studio 打开 LocalDB ,进入 /Security/Logins,添加 NETWORK SERVICE 本地账户,并在用户映射中将其添加为 dbo (dbo.dbowner)

  3. 在连接字符串中使用共享名称,如下所示:

    "Data Source=(localdb)\.\SharedDB;Initial Catalog=[YOUR DB];Integrated Security=SSPI;"
    

编辑 这里是我添加到我的项目中的脚本,请将databasename更改为您的数据库名称:

sqllocaldb create MSSQLLocalDB
sqllocaldb start MSSQLLocalDB
sqllocaldb share mssqllocaldb sharedlocal
sqllocaldb stop MSSQLLocalDB
sqllocaldb start MSSQLLocalDB

"c:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -S "(localdb)\.\sharedlocal" -d "databasename" -Q"create login [nt authority\network service] FROM windows with DEFAULT_DATABASE=databasename;use databasename;exec sp_addrolemember 'db_owner', 'nt authority\network service';"

它对我有效。除了我的连接字符串是Data Source=(LocalDb)\.\SharedDB;Initial Catalog=[YOUR DB];Integrated Security=True。谢谢! - tsu1980
我还需要停止/启动本地数据库实例,以便共享生效。 - JohnnyFun
1
鼓掌!这个脚本太棒了! - Andrii

-3
关于在服务化编程中使用IIS,我认为你不能在IIS中托管一个服务化的ASP.NET应用程序。这就是为什么当你创建无状态的ASP.NET SF项目时,默认的托管方式是Owin。

1
我收到的错误并没有意识到我尝试在Service Fabric中运行LocalDB,因此它的建议并不意味着SF可以与IIS一起工作。 - shlatchz
这个问题并没有暗示他们正在使用或想要使用IIS。他们遇到的问题是当他们在开发机器上运行Service Fabric集群时,无法连接到同一台机器上托管的数据库。 - The Muffin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接