2

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

4 回答 4

2

我假设您首先使用代码。如果是这种情况,那么您在上下文类中覆盖 OnModelCreating 并添加以下行

modelBuilder.Entity<Computer>().HasOptional(c => c.User);

================ 好的,在我发布我的答案后你改变了你的帖子。

您可以使用

诠释?idUser

对于您的用户 ID,这将让 EF 知道您允许为空的关系。

于 2014-04-15T14:46:45.980 回答
1

您可以使用?关键字。它使您的类型成为一种Nullable类型。

例如int通常不允许空值。

但是在附加 a 之后?int您可以将 null 分配给它。

int? iCanHaveNull = null;
于 2014-04-15T14:37:19.877 回答
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]会这样做。

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/

于 2021-03-30T14:13:41.863 回答
-3

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

? 字符使字段可以为。确保它在您的数据库中也可以为空。

于 2014-04-15T14:37:46.757 回答