实体框架代码优先的空外键


107

我有一个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。
牢不可破

1
如果我们想使其不为空。我们需要使用流利的api(如果没有),然后使用“ Required”属性进行修饰。我对么?
牢不可破

2
如果我们不这样做,那么外键将默认为Nullable
Unbreakable

Answers:


165

您必须使外键可为空:

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

7
虚拟是做什么的?
Shawn Mclean

32
延迟加载需要虚拟。
Ladislav Mrnka 2011年

2
Virtual还添加了变更跟踪,这并非总是需要的。我们唯一希望虚拟化的时间是集合,但是YMMV。
Dan VanWinkle

1
@TravisJ user.Country返回null,然后...捕获异常(最佳)或使用if(eww)
SparK 2014年

7
另外-这似乎不适用于Guid基于键的键。(确保它们可以为空,但是,由于自动生成的外键约束,将外键设置为null的记录保存到数据库失败。):-(
BrainSlugs83

8

我喜欢这个(下):

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,但是上面的代码解决了这个问题。


6

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

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

在DBContext类中,很抱歉为您回答得很晚:)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.