我正在调查一个新的项目,这将是一个社交网络风格的网站.我正在阅读RavenDb,我喜欢它的很多功能.我没有读过nosql这么多,但我想知道它是否适合最适合的利基,旧学校sql仍然是其他东西的最佳选择.
我认为权限插件对于社交网络风格的网站来说是理想的 - 但是它真的会在数据库受到重创的环境中执行 - 或者它是否针对更可靠的报告风格系统进行了优化在数据库中投放新的数据结构并报告这些结构.
我渴望使用正确的工具 - 我将使用MVC3,Windsor + Nhibernate + Sql server或RavenDb.
我应该坚持使用旧的学校sql还是和街区的新孩子一起去:ravendb?
我可以使用哪些数据访问体系结构与Raven DB一起使用?
基本上,我想通过接口分离持久性,所以我不会将下划线存储暴露给上层.即我不希望我的域看到来自Raven DB的IDocumentStore或IDocumentSession.
我已经实现了通用存储库模式,这似乎有效.但是,我不确定这是否是正确的方法.也许我会去命令查询隔离或其他什么?
你的想法是什么?
面向文档的数据库(特别是RavenDB)真的很吸引我,而且我想和他们玩一下.然而,作为一个非常习惯于关系映射的人,我试图想到如何在文档数据库中正确建模数据.
假设我的C#应用程序中有以下实体的CRM(省略了不需要的属性):
public class Company
{
public int Id { get; set; }
public IList<Contact> Contacts { get; set; }
public IList<Task> Tasks { get; set; }
}
public class Contact
{
public int Id { get; set; }
public Company Company { get; set; }
public IList<Task> Tasks { get; set; }
}
public class Task
{
public int Id { get; set; }
public Company Company { get; set; }
public Contact Contact { get; set; }
} …Run Code Online (Sandbox Code Playgroud) data-modeling document-based-database document-database ravendb
当RavenDB仍在运行,托管其他数据库时,有什么方法可以删除单个数据库中的所有数据?
在RavenDB为不同客户托管多个数据库的生产环境中,停止RavenDB以从单个数据库中删除数据是不可接受的.是否有必要自定义开发工具,单独删除文档来实现这一目标?
当我尝试在RavenDb上创建数据库人员集合时,我收到以下错误:
远程服务器返回错误:(403)禁止.
我热衷于IIS上的Raven,我不知道发生了什么.在乌鸦Management Studio上,当我尝试创建数据库时,我得到以下结果:
无法对服务器进行身份验证
消息:远程服务器返回错误:NotFound.Uri:/ databases?database =默认服务器Uri: http:// localhost:8888/docs/Raven/Databases/People
- 错误信息 - System.Net.WebException:远程服务器返回错误:NotFound.System.Func的System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
2.Invoke(T arg) at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar,Func2 endMethod, TaskCompletionSource1 tcs)
当我使用进程监视器查看此内容时,我发现我收到了大量未找到的错误:

在C:\Utils\RavenDB\Web目录下,有Bin和Data文件夹,仅此而已.我应该自己创建必要的文件夹吗?我创建了docs文件夹,但没有任何改变.还有问题.
有什么想法吗?
编辑:
通过创建文档在Raven Management Studio上尝试使用fiddler:
请求:
PUT http:// localhost:1786/docs/People HTTP/1.1
接受:/
接受语言:en-US
Referer:http:// localhost:1786/silverlight/Raven.Studio.xap
内容长度:24
Accept-Encoding:身份
如果 - 无匹配:00000000-0000-0000-0000-000000000000
Content-Type:application/json; 字符集= utf-8的
User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/535.7(KHTML,类似Gecko)Chrome/16.0.912.75 Safari/535.7
主持人:localhost:1786
连接:保持活力
Pragma:没有缓存
{
"名称": "..."
}
响应:
HTTP/1.1 403禁止
缓存控制:私有
服务器:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319 …
我正在尝试为新的mvc3项目做一些概念类型代码的基本证明.我们正在使用Moq和RavenDB.
行动:
public ActionResult Index(string id)
{
var model = DocumentSession.Query<FinancialTransaction>()
.Where(f => f.ResponsibleBusinessId == id);
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
测试:
private readonly Fixture _fixture = new Fixture();
[Test]
public void Index_Action_Returns_List_Of_FinancialTransactions_For_Business([Random(0, 50, 5)]int numberOfTransactionsToCreate)
{
// Arrange
var session = new Mock<IDocumentSession>();
var financialController = new FinancialController { DocumentSession = session.Object };
var businessId = _fixture.CreateAnonymous<string>();
var transactions = _fixture.Build<FinancialTransaction>()
.With(f => f.ResponsibleBusinessId, businessId)
.CreateMany(numberOfTransactionsToCreate);
// Mock
var ravenQueryableMock = new Mock<IRavenQueryable<FinancialTransaction>>();
ravenQueryableMock.Setup(x => x.GetEnumerator()).Returns(transactions.GetEnumerator);
ravenQueryableMock.Setup(x => x.Customize(It.IsAny<Action<Object>>()).GetEnumerator()).Returns(() => transactions.GetEnumerator()); …Run Code Online (Sandbox Code Playgroud) 我创建了许多快速的"概念证明"MVC应用程序,我实际上发现随MVC4模板一起提供的SimpleMembership提供程序非常方便,因为它让我在几分钟内启动并运行用户注册和OAuth.
但是......我已经开始使用RavenDb(在我的项目中使用RavenHQ).所以,我开始尝试基于ExtendedMembershipProvider实现我自己的"自定义成员资格提供程序",并且在这样做时我意识到这没有多大意义.我后来偶然发现了两个试图解决这个问题的有趣项目:
两者都是最近非常有趣的努力,并且想知道这些是否是现在唯一正在建造的.我基本上都在寻找nuget pkg,我可以将其放入MVC4应用程序,连接到我的RavenDb并完成.我愿意建立这个东西,但不想重复任何已经在行动的努力.谢谢!
我一直在使用域事件模式 - 它使我们能够在域层中尽可能多地封装行为,并为我们的应用程序的其他部分订阅域事件提供了一种很好的方法.
目前我们正在使用一个静态类,我们的域对象可以调用它来引发事件:
static class DomainEvents
{
public static IEventDispatcher Dispatcher { get; set; }
public static void Raise<TEvent>(TEvent e)
{
if (e != null)
{
Dispatcher.Dispatch(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这仅仅是一个IEventDispatcher实际执行调度或发布事件的垫片.
我们的调度程序实现只是使用我们的IoC容器(StructureMap)来定位指定类型的事件的事件处理程序.
public void Dispatch<TEvent>(TEvent e)
{
foreach (var handler in container.GetAllInstances<IHandler<TEvent>>())
{
handler.Handle(e);
}
}
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都可以.但是,这种方法存在一些问题:
仅在成功持久保存实体时才应分派事件
参加以下课程:
public class Order
{
public string Id { get; private set; }
public decimal Amount { get; private set; }
public …Run Code Online (Sandbox Code Playgroud) 我想将Enums存储为RavenDB文档中的整数值而不是全名.这样做,我想确保,更改枚举值的名称,不会破坏持久性.
使用FluentNHibernate,我可以创建一个自定义约定,但我找不到任何与RavenDB匹配的东西.
我在内存模式下使用RavenDB进行单元测试.我的查询由静态索引支持.我没有使用WaitForNonStaleResults()API(我也不想).
测试的典型工作流程是:
IndexCreation.CreateIndexes(Assembly, IDocumentStore)我注意到步骤1-3发生得如此之快,静态索引没有时间在步骤4之前得到更新 - 因此索引是陈旧的.
我为此创建了一个快速的解决方案.在第3步之后,我执行:
while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0)
Thread.Sleep(10);
Run Code Online (Sandbox Code Playgroud)
这感觉很麻烦.我想知道的是:
ravendb ×10
c# ×4
architecture ×2
asp.net-mvc ×2
database ×2
nosql ×2
conventions ×1
enums ×1
environment ×1
iis ×1
indexing ×1
integer ×1
messaging ×1
mocking ×1
moq ×1
production ×1
testing ×1
unit-testing ×1