将LocalDB与Service Fabric一起使用

shl*_*chz 11 c# entity-framework actor localdb azure-service-fabric

我有一个Actor,在收到来自WebAPI项目的请求后,Actor使用Entity Framework 6查询表.

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

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

@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFileName=C:\Users\xxxx\Metadata.mdf;Connect Timeout=30;Initial Catalog=Metadata;Integrated Security=True;"
Run Code Online (Sandbox Code Playgroud)

当我运行结构服务并且actor尝试访问上下文时,我得到以下异常:

建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:50 - 发生本地数据库运行时错误.无法创建自动实例.有关错误详细信息,请参阅Windows应用程序事件日志.)

并且事件查看器错误是:

无法获取本地应用程序数据路径.很可能没有加载用户配置文件.如果在IIS下执行LocalDB,请确保为当前用户启用了配置文件加载.

我找了一种加载用户配置文件的方法,但我只找到了IIS的解决方案.

请帮忙 :)

jms*_*era 21

由于服务结构在另一个用户下运行,您需要共享数据库并授予NETWORK SERVICE权限:

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

    sqllocaldb share MSSqlLocalDB SharedDB
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用SQL Server Management Studio打开LocalDB并转到/ Security/Logins,添加NETWORK SERVICE本地帐户,并在User Mapping中将其添加为dbo (dbo.dbowner)到您的数据库

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

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

编辑在这里,您有一个我已添加到项目中的脚本,使用您的数据库名称更改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';"
Run Code Online (Sandbox Code Playgroud)