1

对于我正在进行的项目,我不能使用 [dbo] 模式。通过查看 EventStore 源,使用非 dbo 模式看起来并不简单。

到目前为止,我想出的最好的方法是使用这样的自定义方言:

  • 子类 CommonSqlDialect
  • 添加 MsSqlDialect 的私有实例
  • 然后覆盖 CommonSqlDialect 的所有虚拟属性以执行类似的操作

例子:

public override string AppendSnapshotToCommit
{
    get { return customizeSchema(_msSqlDialect.AppendSnapshotToCommit); }
}
private string customizeSchema(string dboStatement)
{
    // replace "[dbo]" with "[notdbo]", 
    // replace " Commits" with " [notdbo].Commits", 
    // replace " Snapshots" with " [notdbo].Snapshots"
}

我还必须自定义 InitializeStorage 属性以将“sysobjects”替换为“sys.objects”,这样我就可以在模式名称上添加额外的约束。

这可行,但似乎应该有用于自定义模式和表名的连接选项。

UsingSqlPersistence(...)
    .WithSchema(...)
    .WithCommitsTable(...)
    .WithSnapshotsTable(...)

有没有更好的方法来处理我错过的这个问题?

4

2 回答 2

3

虽然我可以看到可能需要自定义表名,但现有版本不支持。您需要做的就是将 MsSqlDialect 子类化,然后将您的自定义版本提供给wireup,如下所示:

UsingSqlPersistence(...)
    .WithDialect(new MsSqlDialectWithCustomTableNames());
于 2011-12-14T02:10:34.520 回答
1

不需要任何代码更改且有利于安全性的解决方案:

  1. 在数据库中创建一个新用户并授予他对新模式的只读/写访问权限。
  2. 将新架构设置为用户的默认架构。
  3. 将新的“EventStore”连接字符串添加到配置文件。
  4. 将此新连接传递给UsingSqlPersistence构造函数。

事件存储中的所有查询都没有以模式名称为前缀,因此更改用户的默认模式有效地将所有调用“重定向”到新模式。

更重要的是,拥有一个具有有限权限的事件存储的特定用户无论如何都是一件好事。确保其他数据库用户无权访问您的新架构。

于 2012-11-14T08:00:07.577 回答