MVC 3.0中的默认模型绑定器是否能够处理非顺序索引(对于简单和复杂模型类型)?我遇到的帖子表明应该这样做,但是在我的测试中它似乎没有.
给出后期值:
items[0].Id = 10
items[0].Name = "Some Item"
items[1].Id = 3
items[1].Name = "Some Item"
items[4].Id = 6
items[4].Name = "Some Item"
Run Code Online (Sandbox Code Playgroud)
和控制器方法:
public ActionResult(IList<MyItem> items) { ... }
Run Code Online (Sandbox Code Playgroud)
加载的唯一值是项0和1; 第4项被忽略了.
我已经看到了许多生成自定义索引的解决方案(模型绑定到列表),但是它们似乎都是针对MVC的早期版本,而且大多数都是有点"严厉"的IMO.
我错过了什么吗?
对于针对SQL Server 2008 R2运行的实体框架(4.2)生成的简单SQL查询,我遇到了一些主要的性能问题.在某些情况下(但不是全部),EF使用以下语法:
exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE', @param1...
Run Code Online (Sandbox Code Playgroud)
在其他情况下,只需执行原始SQL,并将提供的参数烘焙到查询中.我遇到的问题是使用sp_executesql执行的查询忽略了目标表上的所有索引,导致执行查询极差(通过检查SSMS中的执行计划来确认).
经过一些研究,听起来这个问题可能是由"参数嗅探"造成的.如果我附加OPTION(RECOMPILE)查询提示,如下所示:
exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE OPTION(RECOMPILE)', @param1...
Run Code Online (Sandbox Code Playgroud)
使用目标表上的索引,并且查询执行速度非常快.我还尝试在数据库实例(http://support.microsoft.com/kb/980653)上切换用于禁用参数嗅探(4136)的跟踪标志,但是这似乎没有任何效果.
这给我留下了一些问题:
附加信息:
我还要提一下,如果我通过服务管理控制台重新启动SQL Server服务,在使用下面的脚本启用跟踪标志4136后,实际上似乎清除了跟踪标志...也许我应该以不同的方式这样做......
DBCC TRACEON(4136,-1)
Run Code Online (Sandbox Code Playgroud) entity-framework parameter-sniffing sql-server-2008-r2 sp-executesql
是否可以通过对象执行组?
from item in context.Items
group item by item.MyObject
select ...
Run Code Online (Sandbox Code Playgroud)
其中Item.MyObject是一个简单的对象,例如:
public class MyObject {
public int SomeValue { get; set; }
public string SomeName { get; set; }
public string SomeOtherProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
显然我可以做到以下几点:
from item in context.Items
group item by new { item.SomeValue, item.SomeName, item.SomeOtherProperty }
select ...
Run Code Online (Sandbox Code Playgroud)
但是,当按具有大量属性的对象进行分组时,这种方法很繁琐且容易出错.
上面的代码导致NotSupportedException,并带有以下消息:"对'GroupBy'方法的调用的密钥选择器类型在底层存储提供程序中不具有可比性".覆盖Equals和GetHashcode没有任何影响.我猜真正的问题是实体框架不知道如何表达SQL ......?
看起来实体框架(来自NuGet的最新版本)在为导航属性构建连接时可能忽略HasRequired配置,而不是定义的第一个.
例如,给定具有以下配置的POCO对象(Person):
var person = modelBuilder.Entity<Person>();
person.ToTable("The_Peoples");
person.HasKey(i => i.Id);
person.Property(i => i.Id).HasColumnName("the_people_id");
person.HasRequired(i => i.Address)
.WithMany()
.Map(map => map.MapKey("address_id"));
person.HasRequired(i => i.WorkPlace)
.WithMany()
.Map(map => map.MapKey("work_place_id"));
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下查询加载人员列表:
myContext.Set<People>()
.Include(o => o.Address)
.Include(o => o.WorkPlace);
Run Code Online (Sandbox Code Playgroud)
实体框架生成以下查询:
FROM [dbo].[The_Peoples] AS [Extent1]
INNER JOIN [dbo].[The_Addresses] AS [Extent2] ON [Extent1].[address_id] = [Extent2].[address_id]
LEFT OUTER JOIN [dbo].[The_Work_Places] AS [Extent3] ON [Extent1].[work_place_id] = [Extent3].[work_place_id]
Run Code Online (Sandbox Code Playgroud)
请注意,*The_Addresses*表的连接是内连接(如预期的那样),但是,*The_Work_Places*的后续连接是外连接.鉴于Address和WorkPlace属性都标记为必需,我希望两个连接都是内连接.我还尝试使用Required属性标记Address和WorkPlace属性,但这没有任何效果.
这是一个错误还是我可能错误配置了什么?建议?
在将整数列与十进制值相乘并添加整数列时,EF6在处理舍入方面似乎不一致.
// CREATE TABLE MyTable (MyIntValue INT NOT NULL)
// INSERT INTO MyTable (MyIntValue) VALUES (10)
const int IntScale = 5;
const decimal DecimalScale = 5;
const decimal DecimalScale2 = 5.0m;
context.Set<MyTable>()
.Select(row => new
{
WithFloats = 0.5f + (row.MyIntValue * 5.0f), // 50.5
WithDecimals = 0.5m + (row.MyIntValue * 5.0m), // 51
WithDecimals2 = 0.5m + ((decimal)row.MyIntValue * 5.0m), // 50.5
WithDecimals3 = 0.5m + ((decimal)row.MyIntValue * IntScale), // 51
WithDecimals4 = 0.5m + ((decimal)row.MyIntValue * (decimal)IntScale) // …
Run Code Online (Sandbox Code Playgroud) 我有一个TopShelf(3.1.3)服务,当引发异常时,该服务会挂在“正在停止”状态。结果,没有任何服务恢复步骤被调用,并且只有通过“ taskkill”手动终止服务后,卸载服务才能成功。
在TopShelf中处理异常的推荐方法是什么?我不希望简单地吞下/记录异常并继续。理想情况下,对hostControl.Stop的调用确实会将服务置于“已停止”状态,但是事实并非如此。
该线程提出了类似的问题,但是它没有提供答案: 如何捕获异常并停止Topshelf服务?
有什么想法吗?
HostFactory.Run(o =>
{
o.UseNLog();
o.Service<TaskRunner>();
o.RunAsLocalSystem();
o.SetServiceName("MyService");
o.SetDisplayName("MyService");
o.SetDescription("MyService");
o.EnableServiceRecovery(r => r.RunProgram(1, "notepad.exe"));
});
public class TaskRunner : ServiceControl
{
private CancellationTokenSource cancellationTokenSource;
private Task mainTask;
public bool Start(HostControl hostControl)
{
var cancellationToken = cancellationTokenSource.Token;
this.mainTask = Task.Factory.StartNew(() =>
{
try
{
while (!this.cancellationTokenSource.IsCancellationRequested)
{
// ... service logic ...
throw new Exception("oops!");
}
}
catch (Exception)
{
hostControl.Stop();
}
});
return true;
}
public bool Stop(HostControl control)
{
this.cancellationTokenSource.Cancel();
this.mainTask.Wait();
return true;
} …
Run Code Online (Sandbox Code Playgroud) 我正在使用带有自定义knockout绑定的select2来提供动态标记支持.不幸的是,当用户修改select2控件时,绑定的可观察数组会被逗号分隔的值字符串覆盖,而不是简单地将新值添加到observable数组.我猜这与我绑定输入值的方式有关,但我似乎无法找到另一种方法.任何帮助将不胜感激!
JSFiddle:http://jsfiddle.net/gk8a6sht/6/
JavaScript的:
ko.bindingHandlers.select2 = {
init: function(element, valueAccessor) {
var options = ko.toJS(valueAccessor()) || {};
setTimeout(function() {
$(element).select2(options);
}, 0);
}
};
var viewModel = {
values: ko.observableArray(["red", "grey", "blue"])
};
ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)
HTML:
<input data-bind="value: values, select2: { tags: values, tokenSeparators: [',', ' '] }"/>
Run Code Online (Sandbox Code Playgroud) c# ×2
dbcontext ×1
decimal ×1
group-by ×1
include ×1
javascript ×1
jquery ×1
knockout.js ×1
linq ×1
modelbinders ×1
rounding ×1
topshelf ×1