我们在EntityFramework 6之上使用SharpRepository,到目前为止工作得很好。我们还在实施完整的单元测试,在研究批准的方法进行单元测试时,SharpRepository与CacheRepository一起使用,这使我们可以使用一致的测试数据填充repo,然后针对这些测试存储库测试服务和模型。这也是大部分工作。
我已经设置了标准缓存策略和内存提供程序,我还尝试使用Add函数单独添加每个对象并作为列表添加。
设置
[TestInitialize]
public void Initialize()
{
var sharpRepositoryConfiguration = new SharpRepositoryConfiguration();
sharpRepositoryConfiguration.AddCachingStrategy(new StandardCachingStrategyConfiguration("standard"));
sharpRepositoryConfiguration.AddCachingProvider(new InMemoryCachingProviderConfiguration("inmemory"));
sharpRepositoryConfiguration.AddRepository(new CacheRepositoryConfiguration("textFilter", "TextFilter", "standard", "inmemory"));
textFilterRepo = sharpRepositoryConfiguration.GetInstance<TextFilter, int>("textFilter");
}
[TestCleanup]
public void CleanUp()
{
textFilterRepo.Delete(c => true);
}
这些方法只应分别在每个测试方法之前和之后调用,因此不应该在方法本身内引起问题。
添加
List<TextFilter> badwords;
var badword1= new TextFilter
{
ID = 0,
FilterType = 1,
FilterText = "badword1",
DateTimeCreated = DateTime.Now
};
var badword2 = new TextFilter
{
ID = 1,
FilterType = 1,
FilterText = "badword2",
DateTimeCreated = DateTime.Now
};
var badword3 = new TextFilter
{
ID = 2,
FilterType = 1,
FilterText = "badword3",
DateTimeCreated = DateTime.Now
};
badwords = new List<TextFilter>
{
badword1,
badword2,
badword3
};
textFilterRepo.Add(badwords);
正如我之前所说,我已经尝试过单独添加电话和现在的列表,结果相同。
编辑: 我不确定为什么CacheUsed设置为false,我没有其他设置,但我想知道这是否是问题的一部分,如果我需要明确调用某些东西让它工作
我对此进行了相当广泛的研究,包括一般的Sharp Repository和具体的单元测试。
我已经看过这个SO,这导致我使用CacheRepository,How can I seed SharpRepository's InMemoryRepository?。但我无法找到有关此信息的任何信息。可能是我已经错误地设置了存储库的缓存,但这就是我所看到的示例中的典型情况。我已经在许多单元测试中成功使用了它,但之前不必填充多个值。
我正在寻找帮助,以确定为什么此设置无法向其添加多个对象的缓存,以及我如何更改此代码,或者我的单元测试设置通常能够容纳多个我的CacheRepository中的对象。
答案 0 :(得分:0)
所以我终于跳进了Sharp Repo源代码,发现了我的问题。首先我会道歉,其中大部分都可以避免,我清理了我的代码示例和命名约定,使其更容易阅读,这掩盖了我的键值与Sharp Repo的命名约定不匹配。问题是,锐利使用基于约定的ID映射(这实际上是一个巨大的便利)。
对于那些感兴趣的人我通过跟踪CacheRepositoryBase.cs中的AddItem方法找到了这个。特定于约定的代码在DefaultRepositoryConventions.cs中,如果您遇到可能值得检查的问题,您需要提取源代码以便明确查看,但对于未来的知识寻求者。
值得一提的是,我还可以使用[RepositoryPrimaryKey]属性,以及重命名我的属性以符合约定,两者都同样有效。通过使用MetaData分部类,注释对自动生成的EF实体特别有用。
非常感谢@JeffTreuting,感谢您的帮助。