Vypořádat se s v Net 6 je s možnou hodnotou null a Entity Framework entity [uzavřen]

0

Otázka

Pomocí Net 6 a Entity Framework mám následující entity:

public class Address {

  public Int32 Id { get; set; }
  public String CountryCode { get; set; }  
  public String Locality { get; set; }
  public Point Location { get; set; }

  public virtual Country Country { get; set; }
  public virtual ICollection<User> Users { get; set; } = new List<User>();  

}

S <Nullable>enable</Nullable> v definici projektu dostávám varování:

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

V Adrese vlastnosti:

CountryCode, Locality, Location and Country.

Vidím několik možností, jak se vypořádat s tímto:

public String? CountryCode { get; set; } 

public String CountryCode { get; set; } = null!; 

Také bych mohl přidat konstruktor, ale ne všechny vlastnosti (například navigační vlastnosti), může být v konstruktoru.

Jaký by byl nejlepší postup?

2

Nejlepší odpověď

3

Osobně, jen jsem dal tento řádek na vrcholu všech mých modelových souborů (POCO/JSON modely, DbContext, atd.):

#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.

Jen dát čáru na horní části souboru, bez nutnosti restore to.

Tam je další "oficiální" řešení, ale je to hrozné:

public Product Product { get; set; } = null!;

Doktor udělal seznam moje řešení jako platné stejně tak jako tak, ale nemusíš to opakovat pro každou vlastnost.

Tip na to, jak vytvořit ten řádek, pokud používáte VS:

enter image description here

Dostanete něco takového:

#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
    public TestContext(DbContextOptions options) : base(options)
#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.

Odstranit poslední řádek a snížit první řádek na začátek souboru.

2021-11-22 16:12:29
2

Narazil jsem na stejnou věc pár dní zpět a vlastně s možnou hodnotou null referenční typ je tam .net 5 taky, ale ruční musíme dodat, že do .csproj a s .net 6 je tam ve výchozím nastavení.

Vzal jsem následující postup.

Pokud vím, že můj majetek je non-možnou hodnotou null a když migrace generování by mělo mít s možnou hodnotou null false pak jsem se dal touto cestou.

public string CountryCode { get; set;} = null!; // This indicate that this property will have value eventually. so no warning generate during compilation.

Když vím, že vlastnost může obsahovat hodnotu null, a také s možnou hodnotou null = true v db nebo migrace pak

public string? CountryCode {get;set;}
2021-11-22 16:11:18

Myslím, že použití "public string? CountryCode {get;set;} nebo public string CountryCode { get; set;} = null!; je irelevantní při použití EF migrace. To, co je v subjektu konfigurace je to, co je aplikován. Mýlím se?
Miguel Moura

To je relevantní. string výsledky v non-možnou hodnotou null pole (VYŽADOVÁNO), zatímco string? umožňuje hodnoty null. Alespoň pro SQLite a SQL Server.
Luke Vo

Částečně správné. Znamená, že pokud jste výslovně stanoví, nastavení, pak to je v pořádku, ale pokud jste právě přidat builder.Majetek(x=>x.Countrycode). V této době s možnou hodnotou null referenční typ hrát svou roli generovat migrace jako s možnou hodnotou null sloupec nebo non-možnou hodnotou null sloupce.
dotnetstep

@dotnetstep Ok, já jsem nastavení Requiredk true nebo false v mé bytosti Plynně Konfigurace, takže se zdá, takže vlastnosti jako s možnou hodnotou null, nebo ne, je přepsána účetní jednotky plynule konfigurace.
Miguel Moura

V jiných jazycích

Tato stránka je v jiných jazycích

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