Attualmente sto cercando di imparare .NET core 2.0 e ASP.NET e sto facendo un approccio code-first su un progetto.
Il problema è che la vista (/ Packages /) non mostra le categorie, anche se sono contrassegnate come [Required] nella classe, lo Scaffolding in qualche modo lo ignora e crea semplicemente la vista senza di essa.
Questo è un grosso problema perché se si tenta di modificare o aggiungere una nuova voce, verrà semplicemente bloccata lì poiché Category è un campo obbligatorio nel DB. Inutile dire che non mostra anche l'elenco dei prodotti ... Cosa mi manca?
Package.CS
public class Package
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int Price { get; set; }
[Required] public virtual Category Category { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Category.CS
public class Category
{
public int ID { get; set; }
public string Name { get; set; }
}
Product.CS
public class Product
{
public int ID { get; set; }
public string SKU_ID { get; set; }
public Category Category { get; set; }
public int Price { get; set; }
public int Cost { get; set; }
public List<Variation> Variations { get; set; }
}
DatabaseContext.CS
public class DatabaseContext : DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
{
}
public DbSet<Brand> Brands { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Combo> Combos { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Package> Packages{ get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<Variation> Variations { get; set; }
}
Ci ho provato anche con e senza
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region Package -> Product Relationship
modelBuilder.Entity<Package>()
.HasMany(x => x.Products);
modelBuilder.Entity<Package>()
.HasOne(xa => xa.Category);
#endregion
}
Ecco come appare la vista:
Va bene, per rispondere alla mia domanda e nella speranza che se qualcuno come me incontra lo stesso problema, sa come risolverlo.
Si scopre che non stavo implementando correttamente la relazione sul mio modello, quindi Entity Framework non era sicuro se fosse davvero una relazione o che cosa fosse esattamente ...
Quindi, in breve, è necessario consentire a tutte le classi che interagiscono insieme di sapere che il loro campo verrà utilizzato e da chi.
Package.CS
public class Package
{
public int PackageId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int Price { get; set; }
public int CategoryID { get; set; }
[Required]
public virtual Category Category { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Tieni presente che devi anche consentire al modello che intendi utilizzare l'altra classe di sapere quale campo è la chiave. Nel mio caso:
public int ID della categoria {get; impostato; }
Category.CS
public class Category
{
public int CategoryId { get; set; }
[Required]
public string CategoryName { get; set; }
public virtual ICollection<Package> Packages { get; set; }
}
E praticamente questi sono tutti i cambiamenti che dovevo fare sul mio modello.
Se, per qualsiasi motivo, ottieni l'ID del tuo tavolo da mostrare su SelectView, non farti prendere dal panico. Significa semplicemente che hai dimenticato di contrassegnare [Required] il campo di testo. [non puoi consentire null]