【问题标题】:Simple usage of EF Core 3 results in error: Sequence contains more than one matching element简单使用 EF Core 3 会导致错误:序列包含多个匹配元素
【发布时间】:2020-12-19 01:02:11
【问题描述】:

我正在为我的应用程序测试 EF Core 3 的使用情况,并按照 Microsoft Docs (https://docs.microsoft.com/en-us/ef/core/get-started/?tabs=netcore-cli) 上的“入门”部分进行操作

我正在使用相应的 PostgreSQL 连接器来连接我的数据库。

我创建了以下模型:

  • 博客
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
        public int Rating { get; set; }
        public List<Post> Posts { get; set; }
    }
  • 发布
   public class Post
   {
       public int PostId { get; set; }
       public string Title { get; set; }
       public string Content { get; set; }
       public Blog Blog { get; set; }
   }

然后,在程序启动时,我尝试在数据库中插入一个新的“博客”。

   using (var db = new BloggingContext())
   {
        db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
        db.SaveChanges();
   }

根据我的理解,这应该没问题。然后我创建迁移,并针对数据库运行它们 - 并且可以看到创建的表具有正确的主键和外键。

然后,我在启动程序时收到此错误: System.TypeInitializationException: The type initializer for 'Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal.NpgsqlStringMethodTranslator' threw an exception. ---&gt; System.InvalidOperationException: Sequence contains more than one matching element

我已经尝试了很长时间来看看我做错了什么,但似乎无法弄清楚。

这里有什么完全错误的吗?

【问题讨论】:

  • 可能是 PostgreSQL 提供程序没有自动将您的 PK 视为身份列并为它们分配一个序列。如果您希望数据库自动分配 ID,您可能需要将 PK 标记为身份列 /w [DatabaseGenerated(DatabaseGeneratedOption.Identity)]。我相信 SQL Server 的提供程序会按照惯例默认此设置,其他提供程序可能不会。
  • 异常消息听起来像内部 EF Core 提供程序错误。因此很可能是 EF Core 提供程序错误/问题,您最好询问/报告给他们的问题跟踪器。
  • 这崩溃了? github.com/npgsql/efcore.pg/blob/dev/src/EFCore.PG/Query/…(其中一个.Single() 调用返回多个结果)
  • 框架版本和库版本之间是否有奇怪的不匹配?虽然我不认为 typeof(string) 有比这 2 个 Substring 更多的方法......

标签: c# .net postgresql entity-framework-core


【解决方案1】:

System.TypeInitializationException:“Npgsql.EntityFrameworkCore.PostgreSQL.Query.ExpressionTranslators.Internal.NpgsqlStringMethodTranslator”的类型初始化程序引发了异常。 ---> System.InvalidOperationException: 序列包含多个匹配元素

从异常消息中,NpgsqlStringMethodTranslator 类型调用了.Single().SingleOrDefault(),同时初始化了一个静态成员。但该序列有 2 个或更多项。

此类型的源代码可在online 获得。我看到调用.Single() 来定位2 个系统方法和2 个扩展方法。但是,它们对我来说看起来不错。每种情况下都应该有一个匹配的结果。

您提到了 EF Core 3,我只能建议您验证框架和 nuget 包的版本是否一致。如果您看不到任何明显的问题,也许可以将 .csproj 文件的相关部分添加到您的问题中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多