小编min*_*ods的帖子

MVC3非顺序索引和DefaultModelBinder

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.

我错过了什么吗?

defaultmodelbinder modelbinders asp.net-mvc-3

41
推荐指数
3
解决办法
1万
查看次数

实体框架4.2 exec sp_executesql不使用索引(参数嗅探)

对于针对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)的跟踪标志,但是这似乎没有任何效果.

这给我留下了一些问题:

  1. 无论如何将OPTION(RECOMPILE)查询提示附加到Entity Framework生成的SQL?
  2. 反正有没有阻止Entity Framework使用exec sp_executesql,而只是运行原始SQL?
  3. 还有其他人遇到这个问题吗?还有其他提示/提示吗?

附加信息:

  1. 我确实通过SSMS重启了数据库实例,但是,我将尝试从服务管理控制台重新启动服务.
  2. 参数化设置为SIMPLE(is_parameterization_forced:0)
  3. 针对特殊工作负载进行优化具有以下设置
    • 值:0
    • 最小值:0
    • 最大值:1
    • value_in_use:0
    • is_dynamic:1
    • is_advanced:1

我还要提一下,如果我通过服务管理控制台重新启动SQL Server服务,在使用下面的脚本启用跟踪标志4136后,实际上似乎清除了跟踪标志...也许我应该以不同的方式这样做......

DBCC TRACEON(4136,-1)
Run Code Online (Sandbox Code Playgroud)

entity-framework parameter-sniffing sql-server-2008-r2 sp-executesql

24
推荐指数
2
解决办法
4448
查看次数

实体框架组是一个对象或ComplexType

是否可以通过对象执行组?

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 ......?

linq-to-entities group-by entity-framework-4

10
推荐指数
1
解决办法
3645
查看次数

实体框架(4.2)HasRequired导致意外的LEFT OUTER JOIN

看起来实体框架(来自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属性,但这没有任何效果.

这是一个错误还是我可能错误配置了什么?建议?

linq entity-framework include dbcontext

9
推荐指数
1
解决办法
1604
查看次数

实体框架十进制舍入在投影中不一致

在将整数列与十进制值相乘并添加整数列时,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)

c# entity-framework decimal rounding

7
推荐指数
0
解决办法
494
查看次数

TopShelf服务在出现异常时处于“停止”状态

我有一个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)

c# error-handling windows-services topshelf

5
推荐指数
1
解决办法
2782
查看次数

Select2用字符串覆盖knockout observableArray

我正在使用带有自定义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)

javascript jquery knockout.js jquery-select2

2
推荐指数
1
解决办法
1299
查看次数