迟到的答案,我知道,但这是一个重要的话题。
您正在尝试设置导航属性。如果您正确声明它(如下例所示),则:
Computer
类中包含的属性User
通过使用外键引用(“指向”)计算机idComputer
。
- 同样,类中
User
包含的属性Computer
通过使用外键引用(“指向”)用户idUser
。
EF 会自动引入此外键,如果
- 你用一个属性装饰
Id
每个实体的主键。[Key]
根据定义,主键不能为空。
- 您正确声明了导航属性(例如
public virtual Computer Computer { get; set; }
- 按照惯例,它创建了一个通过 ForeignKey 属性显式命名为 的外键idComputer
)。此外键在每个定义中都可以为空,除非您将[Required]
属性添加到导航属性。
例如,如果您想让User
实体中引用(“指向”)的外键成为Computer
强制性的,则声明[Key, ForeignKey("idComputer"), Required]
会这样做。
EF Core 的特别说明:您必须通过在包管理器控制台中创建迁移
dotnet ef migrations add CreateMyDatabase
然后通过以下方式将其应用于数据库:
dotnet ef database update --context myDbContext --project myProject
(用您选择的名称替换 CreateMyDatabase、myDbContext 和 myProjects - 但 myDbContext 和 myProjects 必须存在于您的解决方案中)。
这是使用工具集 5.0.3,您可能需要通过以下方式升级它
dotnet tool update --global dotnet-ef --version 5.0.3
例子:
// using System.ComponentModel.DataAnnotations;
// using System.ComponentModel.DataAnnotations.Schema;
public class User
{
public User() {}
[Key]
public int Id { get; set; }
[Required]
public string UserName { get; set; }
[Key, ForeignKey("idComputer")]
public virtual Computer Computer { get; set; }
}
public class Computer
{
public Computer() {}
[Key]
public int Id { get; set; }
[Required]
public string ComputerName { get; set; }
[Key, ForeignKey("idUser")]
public virtual User User { get; set; }
}
有类似的东西可能看起来很奇怪,public virtual User User { get; set}
但这是一个约定,告诉 EF 它是一个导航属性,并且在数据库表中创建的所有内容都是一个外键(这里:idUser
在 table 中Computer
)。您可以在此处找到包含一些附加信息的良好描述:
https://www.tektutorialshub.com/entity-framework-core/ef-core-relationships-navigation-properties/