如何在使用EF的外键上允许空值?
public class User
{
public User()
{
}
public int idUser; { get; set; }
[Required]
public string UserName { get; set; }
public virtual Computer Computer{ get; set; }
}
public class Computer
{
public Computer()
{
}
[Key, ForeignKey("User")]
public int idUser{ get; set; }
public string ComputerName {get;set;}
public virtual User User { get; set; }
}
运行此操作我在外键上获得not null
。
答案 0 :(得分:2)
我假设您首先使用代码。如果是这种情况,则在上下文类中重写OnModelCreating并添加以下行
modelBuilder.Entity<Computer>().HasOptional(c => c.User);
===== 好的,你在我发布答案后改了你的帖子。
您可以使用
INT? ID用户所
对于您的用户ID,这将让EF知道您允许可以为空的关系。
答案 1 :(得分:1)
您可以使用?
关键字。它会使您的类型成为Nullable
类型。
例如int
通常不允许空值。
但是在向?
追加int
后,您可以为其指定空值。
int? iCanHaveNull = null;
答案 2 :(得分:0)
我知道答案晚了,但这是一个重要的话题。
您正在尝试设置导航属性。如果您正确声明(如下例所示),则:
Computer
类中包含的属性 User
使用外键 idComputer
引用(“指向”)一台计算机。User
类中包含的属性 Computer
使用外键 idUser
引用(“指向”)用户。EF 自动引入这个外键,如果
Id
属性修饰每个实体的主键 [Key]
。主键每个定义都不能为空。public virtual Computer Computer { get; set; }
- 按照约定创建了一个通过 ForeignKey 属性显式命名为 idComputer
的外键)。此外键根据定义可以为空,除非您将 [Required]
属性添加到导航属性。 User
实体中的外键引用(“指向”)Computer
是强制性的,那么声明 [Key, ForeignKey("idComputer"), Required]
就可以做到这一点。< /li>
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
在表 Computer
中)。
您可以在此处找到带有一些附加信息的良好描述:
https://www.tektutorialshub.com/entity-framework-core/ef-core-relationships-navigation-properties/
答案 3 :(得分:-2)
如何在使用EF的外键上允许空值?
如果您计划采用以下方法,您的数据库表也应该允许空值:
变化
public int idUser; { get; set; }
[Required]
public string UserName { get; set; }
public virtual Computer Computer { get; set; }
要
public int idUser; { get; set; }
[Required]
public string UserName { get; set; }
public virtual Computer Computer{ get; set; }
并改变
[Key, ForeignKey("User")]
public int idUser { get; set; }
public string ComputerName { get; set; }
public virtual User User { get; set; }
要
[Key, ForeignKey("User")]
public int? idUser { get; set; }
public string ComputerName { get; set; }
public virtual User User { get; set; }
?
字符构成一个字段nullable。确保它在您的数据库中也可以为空。