我目前在
dotnet ef migrations add Initial
期间收到以下错误
无法创建类型为“”的“DbContext”。
异常“无法映射‘TestParent’属性‘TestChild.Parent’,因为数据库提供程序不支持此类型。
考虑使用值转换器将属性值转换为数据库支持的类型。
请参阅 https://aka.ms/efcore-docs-value-converters 了解更多信息。
或者,使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”从模型中排除该属性。尝试创建实例时抛出。 有关设计时支持的不同模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728
我的最小模型如下所示:
public class RecipeContext : DbContext
{
public DbSet<TestParent> Parents { get; set; }
public RecipeContext(DbContextOptions<RecipeContext> options)
: base(options) { }
}
[PrimaryKey(nameof(Name))]
public class TestParent
{
[Required]
public string Name { get; set; }
public virtual ICollection<TestChild> Children { get; set; }
}
[PrimaryKey(nameof(Parent))]
public class TestChild
{
[Required]
public virtual TestParent Parent { get; set; }
}
在现实世界中,
TestChild
有一个复合主键,所以它确实比这个最小的例子更有意义。
我已经对 Sqlite 和 SQL Server 提供程序进行了尝试,两者都提供了相同的错误,这使我相信它不是特定于某个提供程序的,而是 EF Core (v8.0.4) 中的一个“错误”或更多更有可能是对 EF Core 中的导航链接/外键属性如何协同工作存在一些误解。
只要我在
PrimaryKey
类的 TestChild
属性中没有导航/外键成员(父级),它就可以工作。例如如果我将另一列(如 Id
)添加到 TestChild
,并将其作为 PrimaryKey
的 TestChild
,它将起作用。
然而,这并不真正符合我想要的唯一性约束。对于每个
Parent
,只能有一个具有相同名称的Child
(因此在现实世界中我想要PrimaryKey(nameof(Parent),nameof(Name)
)。
对此的任何指导都会很棒。也许 EF Core doco 准确地描述了我想要的内容(以及我如何做错了)?
EF Core 默认按照约定工作,它无法理解您当前的设置。您可以显式声明导航属性键:
[PrimaryKey(nameof(ParentName))]
public class TestChild
{
public string ParentName { get; set; }
[Required]
[ForeignKey(nameof(ParentName))]
public virtual TestParent Parent { get; set; }
}
另请参阅: