0

我知道这个问题在 Stack Overflow 上已经出现过很多次了。我看过它们,但相信这是独一无二的:

  • 我没有使用.Single().SingleOrDefault()在任何 LINQ 表达式中
  • 我检查了我的模型是否有重复项,例如“Id”和“ID”,没有
  • 这发生在任何 Kendo UI MVC 网格、任何表格、我的网站中具有此类网格的任何页面上,并且我们有几个不同的页面,每个页面都有自己的网格

只是一些历史,我们只是将一些外键从 ID(整数)更改为 Guid,以便将它们指向数据库中与代码中当前不同的表。相应地更新了模型。我们还为要指向的剑道网格添加了一个视图,并且在视图中进行了更改。但即使是与原始或新 SQL 视图/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;
}

它不断给出错误“序列包含多个匹配元素”。它将在该错误的中间线上突出显示。

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

4

1 回答 1

1

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

首先,如果我注释掉public virtual DbSet<blah> blah { get; set; }数据库中的实体,以及与其模型有关的所有内容,旧代码将再次起作用。所以这告诉我问题出在模型中。我还想我可以随便命名“blah”。我发现它应该以数据库或视图名称命名,所以我相应地更新了它。

其次,我发现我的模型存在一些重大问题,我在模型上使用了一些装饰,而背后的知识却很少。前任。

[Key]
[Column(name:"GUID", order:2)]
public Guid Guid

之所以是 #2,是因为 ID 是 #1,如果我像上面一样输入 ID,我会在 ID 下得到一个绿色波浪线,说'MyProject.Entities' hides inherited member 'MyProject.Entities.PersistedEntity<int>.Id'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. 那是因为PersistedEntity<int>继承的类已经包含了 Id 和 Name,一个团队成员已经有了添加。我将其注释掉并以正常方式声明了 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)]属性。

第三,我还在类上方添加了一个装饰,称它为表格,尽管这是为了一个视图(奇怪):

[Table("My.View")]

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

在获得具有正确注释的模型后,我能够取消注释掉主数据库模型中的 DbSet,并且由于我的团队成员使用了“Id”,当我重新生成模型时,我需要更新网格的 ID在剑道视图中使用:

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

另外,请注意,我只有在升级到 Entity Framework 6.1 后才能使其完全正常工作。在此之前,我收到“无效的对象名称'dbo.My.View'”。显然,在早期版本的 EF 中,您不能只为表/视图添加模型并期望它找到它。

于 2014-08-06T01:40:06.853 回答