Eliminar de una posible referencia nula en Entity Framework 6 de consulta

0

Pregunta

Tengo un .RED 6 proyecto con referencia a los tipos que aceptan valores null habilitado (<Nullable>enable</Nullable>). Tengo este EF entidad:

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; }
}

He añadido ? de arriba para evitar este tipo nullable advertencia:

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

Ahora, tengo este Entity Framework 6 de consulta de LINQ:

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

... pero me sale el siguiente aviso:

Dereference of a possibly null reference.

... en esta parte de mi consulta:

x.User.Id == ...

Cómo puedo solucionar esta advertencia?

4

Mejor respuesta

2

Creo que te refieres a algo como:

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; }
}

Su problema original es una advertencia de que C#8 introdujo con el ser más explícito con null-capaz de tipos de referencia. Para una entidad, la implementación no es válido a menos que estas relaciones son, de hecho, opcional, que requeriría su FK campos (id de usuario y PostId) también se podrá Null. Que probabilidad hay de que no opcional.

Las principales opciones para tratar este:

A) desactivar la función. (Desactivar null-capaz de referencias en el proyecto)

B) Pedir "perdón" por el hecho de que estos nunca deben ser nulo, pero no será en un estado válido en la construcción. (EF se administrarlos)

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!;
}

La alteración de la modelo a la marca de las propiedades de navegación como null-capaz de referencias es probable que la causa todo tipo de problemas como con las migraciones se puede, y se iniciará la sustitución no podrá null FKs con nulo poder queridos. Para marcar estas referencias como Nulo poder y mantener EF feliz:

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; }
}

Que es casi seguro que no lo quieres en tu dominio, o incluso legal si el id de usuario y PostId son parte de un PK.

Personalmente estoy despedazando este cambio en C# como una "mina" de MS habilitado inicialmente por defecto, del Lado del Cliente como de la Evaluación en la EF. :) Preveo muchos-a-StackOverflow preguntas en torno a esta advertencia o cambios recientes, y muchos-a-cliente de códigos base llena de "!" perdón etiquetas de lo anterior no podrá null objetos/referencias se transmiten en código con nulo poder controles de referencia.

2021-11-24 23:15:24
1

Usted debe marcar la navegación entidades como que aceptan valores null. Usted no debe tener la carga diferida habilitado, y por lo tanto las propiedades de navegación puede ser devuelto como null a partir de consultas. Incluso si son necesarios en la base de datos, el código no tiene que cargar con ellos.

En sus expresiones de consulta, usted puede estar seguro de que Entity Framework no va a ejecutarlas clientside, pero analizar una consulta SQL de ellos.

Por lo tanto:

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

Usted puede decirle al compilador con User! que usted sabe que no va a ser null allí. A menos que se active clientside de evaluación, pero que no debería, y si usted lo hace, usted necesita una verificación null allí de todos modos.

Como para el uso de PostFile.Usercomo en:

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

No puede ser null si no Include(p => p.User) y no tiene carga diferida habilitado, por lo que user sería necesario una verificación null antes de su uso.

Si usted hacer uso de la carga diferida, usted puede desactivar la advertencia:

#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

Creo que necesitas esto:

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

Y llame a

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

No. De no marcar estas propiedades como que aceptan valores null hace que el compilador emite advertencias de que podría no ser inicializado, lo cual es cierto.
CodeCaster
0

¿Qué acerca de var postFiles = context.postFiles.Where(x => x.User != null && x.User.Id == request.UserId);?

2021-11-24 22:53:01

En otros idiomas

Esta página está en otros idiomas

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