EF Core 模型由于 PrimaryKey 引用外键而无法创建迁移

问题描述 投票:0回答:1

我目前在

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 准确地描述了我想要的内容(以及我如何做错了)?

entity-framework-core foreign-keys primary-key navigation-properties ef-core-8.0
1个回答
0
投票

EF Core 默认按照约定工作,它无法理解您当前的设置。您可以显式声明导航属性键:

[PrimaryKey(nameof(ParentName))]
public class TestChild
{
    public string ParentName { get; set; }
    
    [Required]
    [ForeignKey(nameof(ParentName))]
    public virtual TestParent Parent { get; set; }
}

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.