ChatGPT解决这个技术问题 Extra ChatGPT

我有一个 User < Country 模型。用户属于一个国家,但可能不属于任何国家(空外键)。

我该如何设置?当我尝试插入一个国家为空的用户时,它告诉我它不能为空。

模型如下:

 public class User{
    public int CountryId { get; set; }
    public Country Country { get; set; }
}

public class Country{
    public List<User> Users {get; set;}
    public int CountryId {get; set;}
}

错误:A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}

如果我错了,你能纠正我吗?在代码优先 asp.net mvc - 5 实体框架中,外键默认为 NULLABLE。
如果我们想让它不可为空。如果没有,我们需要使用流利的 api,然后使用“必需”属性进行装饰。我对么?
如果我们都不这样做,那么外键将默认为 Nullable

L
Ladislav Mrnka

您必须使您的外键可以为空:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}

延迟加载需要虚拟。
Virtual 还添加了更改跟踪,这并不总是需要的。关于我们唯一想要虚拟的时间是在集合上,但 YMMV。
@LadislavMrnka - 当 id 为空(引发异常)时尝试获取导航属性时,延迟加载将如何工作?
@TravisJ user.Country 返回 null 然后...捕获异常(最佳)或使用 if (eww)
另外——这似乎不适用于基于 Guid 的键。 (当然,这使它们可以为空,但是由于自动生成的外键约束,将外键设置为空的记录保存到数据库失败。):-(
M
Mark Cooper

我更喜欢这个(下):

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    [ForeignKey("CountryId")]
    public virtual Country Country { get; set; }
}

因为 EF 在数据库表中创建了 2 个外键:CountryId 和 CountryId1,但上面的代码修复了该问题。


这正是我遇到的问题。我的实体中什至没有导航属性,所以无论如何都会发生这种情况有点奇怪。
r
r3plica

我现在有同样的问题,我有外键,我需要把它设置为可空的,要解决这个问题,你应该把

    modelBuilder.Entity<Country>()
        .HasMany(c => c.Users)
        .WithOptional(c => c.Country)
        .HasForeignKey(c => c.CountryId)
        .WillCascadeOnDelete(false);

在 DBContext 课上我很抱歉很晚才回复你:)


'WithOptional' 对 EFCore 无效...只有 'WithOne'
A
Anonimys

我建议首先阅读 Microsoft guide for use Relations, Navigation Properties and Foreign Keys in EF Code First,就像这张图片。

https://i.stack.imgur.com/G2bKa.png

指导链接如下:

https://docs.microsoft.com/en-gb/ef/ef6/fundamentals/relationships?redirectedfrom=MSDN