【发布时间】: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. ---> 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