역참조의 가능성 null 참조 Entity Framework 에서 6 쿼리

0

질문

나는가.NET6 프로젝트로 널 참조 형식을 사용(<Nullable>enable</Nullable>). 이 EF entity:

public class PostFile {
  public Int32 UserId { get; set; }
  public Int32 PostId { get; set; }

  public virtual User? User { get; set; }
  public virtual Post? Post { get; set; }
}

? 위에 이를 방지하기 위해 null 허용 경고:

Non-nullable property '...' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.

지금,나는 이 Entity Framework6 쿼리:

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId);

...그러나 나는 다음과 같은 경고:

Dereference of a possibly null reference.

...에 이 부분의 내 쿼리:

x.User.Id == ...

어떻게 하면 이 문제를 해결할 수 있을 경고?

4

최고의 응답

2

나는 당신이 뭔가 의미 다음과 같:

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

원래의 문제가 경고하는 C#8 과 함께 소개되는 더 많은 명시적으로 null 참조할 수 있 형식입니다. 엔터티,위의 구현은 유효하지 않으면 이러한 관계는 실제로 선택하는 것이 필요 FK 분야(사용자 Id 및 PostId)도 Null 이 될-수 있습니다. 그들은 가능성이 있 지 않은 선택사항입니다.

기본 옵션을 주는 이것:

A)기능을 끕니다. (비활성화 null 참조할 수 있는 프로젝트에서)

B)"용서"는 사실에 대한 이해야 하지 않은 null 이 될 것입니다 하지만에 있는 유효한 상태에서 건설입니다. (EF 것입니다 그들을 관리)

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User User { get; set; } = null!;
    public virtual Post Post { get; set; } = null!;
}

을 변경하는 모델을 표 속성을 탐색으로 null 참조할 수 있는 일으킬 가능성이 모든 종류의 문제로 마이그레이션할 수 있고,교체를 시작 non-null 할 수 있 FKs null-할 수 있다. 표시하는 이러한 참조로 Null 할 수 있고 유지 EF 행복:

public class PostFile {
    public Int32? UserId{ get; set; }
    public Int32? PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

이는 거의 확실하 지 않은 무엇을 원하는 도메인,또는 법적하면 사용자 Id 및 PostId 의 일부 PK.

개인적으로 난 백분이 변경 C#로"나"MS 사용 가능 처음에는 등 기본적으로 클라이언트 측에서 평가 EF. :) 나는 예측은 많은-직접 질문을 이 경고 또는 주요 변경 내용과 많은 클라이언트를 지원으로 뒤덮"!"용서 태그으로 이전 non-null 할 수 있체/참조가 전달된 코드 null 참조할 수 있을 확인합니다.

2021-11-24 23:15:24
1

을 표시해야한 탐색체 입니다. 당신은 게으른 적재 사용하므로 탐색 속성을 반환할 수 있으로 null 에서 쿼리를 처리합니다. 는 경우에도 그들은 필요한 데이터베이스에서,당신의 코드가 없을 로드하는 그들.

쿼리에 표현할 수 있는 특정 엔터티 Framework 하지 않을 실행하여 설치를 관리하지만,분석에서 SQL 쿼리를 수 있습니다.

따라서:

.Where(x => x.User!.Id == request.UserId)

할 수 있게 컴파일러와 User! 는 당신이 그것을 알지 않을 것이 null 이 될 수 있다. 를 사용하지 않으면 클라이언트 측 평가,하지만 당신은지,그리고 당신이 할 경우,당신은 필요 null 확인을 즐기실 수 있습니다.

로의 사용에 대한 PostFile.User로 in:

var postFile = dbContext.PostFiles.FirstOrDefault(p => p....) ?? throw ...;
var user = postFile.User;

그것은 있을 수 있습니다 null 지 않은 경우 Include(p => p.User) 고 있지 않으로드 사용,그래서 user 필요 null 체크인하기 전에 사용합니다.

는 경우에 당신은 사용으 로드 중지할 수도 있습니다 경고:

#pragma warning disable CS8618 // EF initializes these properties through lazy loading
    public virtual User User { get; set; }
#pragma warning restore CS8618 
2021-11-24 22:37:30
0

나는 당신이 필요하다:

public class PostFile {
    public User User { get; set; }
    public Post Post { get; set; }
}

와 전화

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId).Include(x => x.Post);
2021-11-24 22:52:47

No. 표시하지 않는 이러한 특성으로 널 만든 컴파일러 경고하지 않을 수도 있다는 것을 초기화는 사실입니다.
CodeCaster
0

에 대해 무엇 var postFiles = context.postFiles.Where(x => x.User != null && x.User.Id == request.UserId);?

2021-11-24 22:53:01

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................