如何使用EF在外键上允许空值?

时间:2014-04-15 14:34:48

标签: c# entity-framework

如何在使用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

4 个答案:

答案 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。确保它在您的数据库中也可以为空。