我正在将应用程序从EF1升级到EF4.1我使用"ADO.NET DbContext Generator"模板创建了一个DbContext和一组POCO.
当我查询生成的DbContext时,查询的数据库部分需要4ms才能执行(使用EF Profiler验证).然后它将上下文大约40秒(用文字:FORTY!)在它将结果返回给应用程序之前做任何事情.
EF1在不到2秒的时间内处理相同的查询.
关闭AutoDetectChanges,LazyLoading和ProxyGeneration赢了2-3秒.
当我使用AsNoTracking()扩展方法时,我能够将总执行时间减少到大约3秒.
这表明ChangeTracking是罪魁祸首.
但ChangeTracking是我需要的.我必须能够最终坚持所有更改,而无需手工挑选修改了哪些实体.
我有什么想法可以解决这个性能问题?
我在Automapper中找到的大多数示例都使用静态Mapper对象来管理类型映射.对于我的项目,我需要使用StructureMap注入IMapperEngine作为对象构造的一部分,以便我们可以在单元测试中模拟映射器,因此我们不能使用静态映射器.我还需要支持配置AutoMapper配置文件.
我的问题是如何配置StructureMap注册表,以便在构造MyService实例时它可以提供IMappingEngine的实例.
这是Service构造函数签名:
public MyService(IMappingEngine mapper, IMyRepository myRepository, ILogger logger)
Run Code Online (Sandbox Code Playgroud)
这是StructureMap注册表
public class MyRegistry : StructureMap.Configuration.DSL.Registry
{
public MyRegistry()
{
For<IMyRepository>().Use<MyRepository>();
For<ILogger>().Use<Logger>();
//what to do for IMappingEngine?
}
}
Run Code Online (Sandbox Code Playgroud)
我要加载的配置文件
public class MyAutoMapperProfile : AutoMapper.Profile
{
protected override void Configure()
{
this.CreateMap<MyModel, MyDTO>();
}
}
Run Code Online (Sandbox Code Playgroud) 我使用Entity Framework 4.1 Code First.我想调用具有输出参数的存储过程,并检索除强类型结果集之外的输出参数的值.它的搜索功能具有这样的签名
public IEnumerable<MyType> Search(int maxRows, out int totalRows, string searchTerm) { ... }
Run Code Online (Sandbox Code Playgroud)
我发现了许多"功能导入"的提示,但这与Code First不兼容.我可以使用Database.SqlQuery(...)调用存储过程,但这不适用于输出参数.
我可以使用EF4.1 Code First解决这个问题吗?
标题说明了一切.我有一些文件,我想在安装NuGet包时嵌套但不能使用PowerShell脚本,因为它们不再运行(见这里).
有没有其他方法可以实现这一目标?
更新:嵌套我的意思是*.resx
和/ *.Designer.cs
或*.xaml
代码隐藏文件*.xaml.cs
.我知道我可以通过<DependentUpon>
在*.csproj文件中添加一个元素来实现这一点,但我不知道如何在不使用PowerShell的情况下添加该元素.
UPDATE2: init.ps1在解决方案中第一次安装软件包时运行.但这不会削减它.当程序包安装到项目中时,我需要运行脚本,就像install.ps1
运行到NuGet3一样.
更新3:我想要做的是将3个文件添加到Properties
目标项目的文件夹中(Resources.resx
,Resources.tt
和Resources.Designer.cs
).它们是通常资源实施的替代品.这些文件在添加到项目中时由nuget包安装.
这是将*.nuspec
文件添加到Content
包文件夹的文件的一部分.由于其中只有一个实际上是内容(其他内容分别是嵌入式资源和编译),因此能够相应地设置其构建操作,但一次只能一步.
<files>
<file src="Properties\Resources.resx" target="content\Properties\Resources.resx" />
<file src="Properties\Resources.tt.pp" target="content\Properties\Resources.tt.pp" />
<file src="Properties\Resources.Designer.cs" target="content\Properties\Resources.Designer.cs" />
</files>
Run Code Online (Sandbox Code Playgroud)
当这些文件被添加到项目中时,我希望在*.csproj
文件中嵌套,而不是通过单独的*.props
文件发生,如果这是某种可能的话.
我正在编写一个自定义ConfigurationSource
/ConfigurationProvider
来访问存储在 Spring Cloud 配置服务器中的配置。
我希望能够将错误和跟踪信息写入日志,但到目前为止还没有找到一种方法来ILogger<T>
在应用程序生命周期的早期获取这些信息。
我知道这个答案,但LoggerFactory.AddConsole
已被弃用。拟议替代方案的唯一实施ILoggingBuilder
是内部实施。复制非常简单的实现也对我没有帮助,因为我无权访问IServiceProvider
.
还有其他想法吗?
更新
没什么太多的,但这将是我的问题的轮廓。Program.CreateWebHostBuilder(string[])
它是ASP.NET Core Web 应用程序的摘录。
IWebHostBuilder builder = WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((webHostBuilderContext, configurationBuilder) =>
{
ILogger<MyCustomConfigSource> logger = ???;
configurationBuilder.Add(new MyCustomConfigSource(logger));
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 VSTS 中创建一个发布管道,该管道运行我的 xUnit-tests,如Test Plan
.
长话短说:我无法让它工作。
我正在使用什么:
在 Azure DevOps 中,我定义了一个Test Plan
,其中包含一个Test Suite
,其中包含一个Test
,其中有一个Associated Automation
指向我的 xUnit 测试。我必须使用 REST API 将测试代码链接到此处Test
所述。
Test
我可以在 VSTest 任务的可视化设计器中选择它。
当我运行发布管道时,VSTest 任务失败并显示以下错误消息:
DiscoveryMessage : System.IO.FileNotFoundException: Unable to find tests for D:\a\r1\a\Foo.Tests.dll. Make sure test project has a nuget reference of package "Microsoft.NET.Test.Sdk" and framework version settings are …
xunit vstest azure-devops azure-pipelines-release-pipeline .net-core-2.1
使用精细的模拟框架MoQ,我遇到了一个有点令人惊讶的方面(我不喜欢惊喜).我正在嘲笑一个应该在方法调用后添加到集合中的类,如下所示:
public class SomeClass{
}
public class Container {
private List<SomeClass> classes = new List<SomeClass>();
public IEnumerable<SomeClass> Classes {
get {
return classes;
}
}
public void addSomeClass(SomeClass instance) {
classes.Add(instance);
}
}
[Test]
public void ContainerContainsAddedClassAfterAdd() {
var mockSomeClass = new Mock<SomeClass>();
mockSomeClass.Setup(c => c.Equals(mockSomeClass.Object)).Return(true);
var Container = new Container();
Container.addSomeClass(mockSomeClass.Object);
Assert(Container.Classes.Contains(mockSomeClass.Object));
}
Run Code Online (Sandbox Code Playgroud)
这很好用,模拟被添加到Container
集合中,并且Equals
模拟方法的设置确保IEnumerable.Contains()
返回true.然而,总有一些复杂因素.我真正嘲笑的课程并不像我们那么简单SomeClass
.它是这样的:
public class SomeClassOverridingEquals{
public virtual Equals(SomeClassOverridingEquals other) {
return false;
}
public override Equals(object obj) {
var …
Run Code Online (Sandbox Code Playgroud) asp.net unity中的接口拦截和构造函数注入有什么区别?我缺乏对Unity的理解我正在研究一个旧项目和unity.config,有些像这样,
<register type="ICRIC2012TrialUserService" mapTo="CRIC2012TrialUserService">
<lifetime type="perthread"/>
<interceptor type="InterfaceInterceptor"/>
<policyInjection/>
</register>
Run Code Online (Sandbox Code Playgroud)
但有些人没有
<interceptor type="InterfaceInterceptor"/>
Run Code Online (Sandbox Code Playgroud)
但是在项目中,这些类和接口以相同的方式工作,就像这样
private readonly IIncomingEstimateService _incomingEstimateService;
public ContractService(IIncomingEstimateService incomingEstimateService)
{
_incomingEstimateService = incomingEstimateService;
}
Run Code Online (Sandbox Code Playgroud) 任务应该非常简单:从我的输入字段开始,找到最接近的p并更改其样式.
唯一的事情是:我找不到我的...
<p>
<div class="form-group">
<label for="Email" class="control-label col-md-2">Email</label>
<div class="col-md-10">
<input type="email" value="" name="Email" class="form-control" />
</div>
</div>
</p>
Run Code Online (Sandbox Code Playgroud)
这是找到p元素的javascript代码
$('[name=Email]').closest("p").css('background-color', 'red')
Run Code Online (Sandbox Code Playgroud)
closest("p")
没有回报.
知道我错过了什么吗?
asp.net-core ×1
automapper ×1
azure-devops ×1
azure-pipelines-release-pipeline ×1
c# ×1
equals ×1
javascript ×1
jquery ×1
logging ×1
mocking ×1
moq ×1
nuget ×1
parameters ×1
performance ×1
powershell ×1
structuremap ×1
unit-testing ×1
vstest ×1
xunit ×1