엔티티 프레임 워크 코드 우선 널 외래 키


107

나는이 User< Country모델. 사용자는 국가에 속하지만 어느 국가에도 속하지 않을 수 있습니다 (널 외래 키).

어떻게 설정합니까? null 국가를 가진 사용자를 삽입하려고하면 null이 될 수 없다는 메시지가 표시됩니다.

모델은 다음과 같습니다.

 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 엔티티 프레임 워크에서 DEFAULT에 의해 NULLABLE입니다.
Unbreakable

1
nullable이 아닌 것으로 만들고 싶다면. 그렇지 않은 경우 유창한 API를 사용하고 "필수"속성으로 장식해야합니다. 나 맞아?
Unbreakable

2
둘 중 하나를 수행하지 않으면 외래 키가 기본적으로 Nullable
Unbreakable

답변:


165

외래 키를 nullable로 만들어야합니다.

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

7
가상은 무엇을합니까?
Shawn Mclean 2011-04-14

32
지연 로딩에는 가상이 필요합니다.
Ladislav Mrnka 2011

2
Virtual은 또한 항상 원하지 않는 변경 추적 기능을 추가합니다. 우리가 가상을 원하는 유일한 시간은 컬렉션이지만 YMMV입니다.
Dan VanWinkle

1
@TravisJ user.Country가 null을 반환 한 다음 ... 예외를 포착하거나 (최적) 사용 if(
eww

7
또한-이것은 Guid기반 키에 대해 작동하지 않는 것 같습니다 . (그것은 그것들을 nullable로 만들지 만, 자동으로 생성 된 외래 키 제약으로 인해 외래 키가 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가 데이터베이스 테이블에 CountryId 및 CountryId1이라는 두 개의 외래 키를 만들었 기 때문에 위의 코드는이를 수정했습니다.


6

나는 지금 같은 문제가 있고, 외래 키가 있고 그것을 nullable로 넣어야합니다.이 문제를 해결하려면 넣어야합니다.

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

DBContext 클래스에서 매우 늦게 답변을 드려 죄송합니다. :)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.