Asp.net mvc &引用;序列包含多个匹配元素;任何剑道格网的超负荷

Asp.net mvc &引用;序列包含多个匹配元素;任何剑道格网的超负荷,asp.net-mvc,entity-framework,razor,kendo-ui-mvc,Asp.net Mvc,Entity Framework,Razor,Kendo Ui Mvc,我知道这个问题在堆栈溢出时已经出现过很多次。我看过了,但相信这是独一无二的: 我没有在任何LINQ表达式中使用.Single()或.SingleOrDefault() 我检查了我的模型是否有重复的,比如“Id”和“Id”,没有 这发生在任何Kendo UI MVC网格的加载上,在任何表格上,在我的网站上有这样一个网格的任何页面上,我们有几个不同的页面,每个页面都有自己的网格 只是一些历史记录,我们只是将一些外键从IDs(ints)更改为GUID,以便将它们指向数据库中与当前代码中不同的表。模

我知道这个问题在堆栈溢出时已经出现过很多次。我看过了,但相信这是独一无二的:

  • 我没有在任何LINQ表达式中使用
    .Single()
    .SingleOrDefault()
  • 我检查了我的模型是否有重复的,比如“Id”和“Id”,没有
  • 这发生在任何Kendo UI MVC网格的加载上,在任何表格上,在我的网站上有这样一个网格的任何页面上,我们有几个不同的页面,每个页面都有自己的网格
只是一些历史记录,我们只是将一些外键从IDs(ints)更改为GUID,以便将它们指向数据库中与当前代码中不同的表。模型也相应更新。我们还为剑道网格添加了一个指向的视图,并且在视图中进行了更改。但即使是与原始或新的SQL view/C#模型无关的网格似乎也受到了影响。现在,在这个阶段:

public OurDatabase(bool enableLazyLoading=true)
    : base("name=OurDBContext")
{
    Database.SetInitializer<OurDatabase>(null);
    ((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled = enableLazyLoading;
    ((IObjectContextAdapter)this).ObjectContext.ContextOptions.LazyLoadingEnabled = enableLazyLoading;
}
public数据库(bool enableLazyLoading=true)
:base(“name=OurDBContext”)
{
Database.SetInitializer(null);
((IObjectContextAdapter)this).ObjectContext.ContextOptions.ProxyCreationEnabled=enableLazyLoading;
((IObjectContextAdapter)this).ObjectContext.ContextOptions.LazyLoadingEnabled=enableLazyLoading;
}
它不断给出错误“序列包含多个匹配元素”。它将在该错误的中间线上高亮显示


数据库中的某些更改会导致这种情况吗?曾经有效的代码,从那时起就没有被修改过,现在不行了,这让人很困惑

我找到了问题的答案。是的,复数

首先,如果我注释掉数据库实体中的
公共虚拟DbSet blah{get;set;}
,以及与其模型相关的所有内容,那么旧代码将再次工作。这告诉我模型中存在问题。我还以为我可以随便给“布拉”取个名字。我发现它应该以DB或视图名称命名,所以我相应地更新了它

第二,我发现我的模型有一些主要问题,我在模型上使用了一些装饰,但背后的知识很少。前

[Key]
[Column(name:"GUID", order:2)]
public Guid Guid
它是#2,因为ID是#1,如果我像上面一样输入ID,我会在ID下面得到一个绿色的曲线,上面写着“MyProject.Entities”隐藏继承成员“MyProject.Entities.PersistedEntity.ID”。要使当前成员覆盖该实现,请添加override关键字。否则,请添加新关键字。 这是因为团队成员已经添加了
PersistedEntity
继承的类,该类中已经有Id和名称。我将其注释掉,并以正常的方式声明ID和Name列(在注释掉该类之前,这些列也是绿色的)

然后,我在复合键上出错,说它无法对它们进行排序(哎呀,我想知道为什么)。他们现在的样子如下:

[Key]
[Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ID { get; set;}

[Key]
[Column(Order = 1)]
public Guid GUID { get; set;}

[Key]
[Column(Order = 2)]
[StringLength(60)]
public string Name { get; set;}
它正确地设置了排序键和组合键,从0开始,而不是我以前的1。我还有其他列,所以我继续在这些列上设置
[Key]
[Column(Order=x)]
属性

第三,我还在类上方添加了一个装饰,称之为桌子,尽管这是为了查看(奇怪):

保留与在控制器中添加新模型相关的注释似乎是解决这个糟糕的、不可描述的错误的方法,对我来说,这个错误没有提到真正的、潜在的问题——至少在本例中是这样。我也不认为我所有的网格都会因为我添加了一个模型而停止工作——即使那些没有指向新模型或它正在替换的模型

在得到带有正确注释的模型后,我能够在我的主数据库模型中取消对dbset的注释,因为我的团队成员使用了“Id”,当我重新生成模型时,我需要更新网格在Kendo视图中使用的Id:

.DataSource(dataSource => dataSource
    .Ajax()
    .Model
    {
        .model.Id(p => p.ID)
    })
另外,请注意,我只有在升级到EntityFramework6.1之后才能使其完全工作。在此之前,我得到的是“无效的对象名'dbo.My.View'”。显然,在EF的早期版本中,您不能仅仅为表/视图添加一个模型并期望它找到它

.DataSource(dataSource => dataSource
    .Ajax()
    .Model
    {
        .model.Id(p => p.ID)
    })