36 messaggi dal 17 maggio 2004
Ciao Ragazzi,
sto cercando di mettere mano a Entity Framework (EF) e mi sembra di non capirci niente.
Ho creato un progetto MVC da VS2013 (premetto che anche MVC è nuovo per me, ma sono in fase di apprendimento per tutto), e ho iniziato nel Model a inserire il modello a oggetti fatto con DataAnnotation.

L'esempio è semplice: Nazioni, Località (a cui appartiene una nzazione), Clienti (a cui appartiene una località) e Contatti Cliente (che sono gli N contatti del cliente)

Di seguito il codice delle classi:

public enum CompanyContactEnum
{
General,
Accounting,
Invoicing,
Transport
}

[ComplexType]
public class AddressInfo
{
public string Street { get; set; }
public string Zip { get; set; }
}

[Table("Country")]
public class Country
{
public Country()
{
this.Locations = new List<Location>();
}

[Key]
public int Id { get; set; }

[Required, MaxLength(50)]
public string Name { get; set; }

[Required, MinLength(3), MaxLength(3)]
public string CurrencyName { get; set; }

[Required, MaxLength(1)]
public string CurrencySymbol { get; set; }

public virtual ICollection<Location> Locations { get; set; }
}

[Table("Location")]
public class Location
{
public Location()
{
this.Companies = new List<Company>();
}

[Key]
public int Id { get; set; }

[Required, MaxLength(50)]
public string Name { get; set; }

[Required]
public bool Inland { get; set; }

[Required]
public int CountryId { get; set; }
[ForeignKey("CountryId")]
public virtual Country Country { get; set; }

public virtual ICollection<Company> Companies { get; set; }
}

[Table("CompanyContact")]
public class CompanyContact
{
[Key]
public int Id { get; set; }

public CompanyContactEnum Type { get; set; }

[Required]
public int CompanyId { get; set; }
[ForeignKey("CompanyId")]
public virtual Company Company { get; set; }

public string PersonReference { get; set; }
[Required]
public string EMail { get; set; }
public string FaxNo { get; set; }
}

[Table("Company")]
public class Company
{
[Key]
public int Id { get; set; }
[Required, MaxLength(50)]
public string Name { get; set; }

public AddressInfo Address { get; set; }

[Required]
public int LocationId { get; set; }
[ForeignKey("LocationId")]
public virtual Location Location { get; set; }

public virtual ICollection<CompanyContact> Contacts { get; set; }

public Company()
{
this.Address = new AddressInfo();
this.Location = new Location();
this.Contacts = new List<CompanyContact>();
}
}

Il relativo Context:

public class DatabaseContext : DbContext
{
public DbSet<Country> Countries { get; set; }
public DbSet<Location> Locations { get; set; }
public DbSet<CompanyContact> CompanyContacts { get; set; }
public DbSet<Company> Companies { get; set; }

public DatabaseContext()
: base("DefaultConnection")
{

}
}

Ora che il modello e il Context sono pronti ho fatto una View in cui ho messo nel Controller della Action Index il seguente codice:

public ActionResult Index()
{
using (DatabaseContext context = new DatabaseContext())
{
var companies = context.Companies.ToList();

foreach (Company c in companies)
{
int counter = c.Contacts.Count();
var x = c.Location.Name;
}
}

return View();
}
Il DB viene creato, ho inserito un po' di dati di prova e fondamentalmente funziona tutto tranne la riga "var x = c.Location.Name;" che mi aspettavo restituisse il nome della Località, ma invece restituisce null nella proprietà Name.

Credendo di aver sbagliato qualcosa, ho creato un nuovo progetto MVC e alla funzione "Reverse Engineer Code First" ho dato in pasto il database creato con l'applicazione precedente per vedere le modifiche.
Evito di riportare il codice creato da VS2013, ma a me sembra abbastanza identico, tranne le classi <NomeEntità>Map.cs.

Il problema è che se faccio la stessa View e copio lo stesso pezzo di codice tutto funziona, cioè mi restituisce il nome della località.

La domanda è semplicemente: Dove sbaglio?

Come al solito, vi ringrazio per il supporto.

Ciao
Francesco
Da un'occhiata veloce è proprio il file map che fa la differenza, per convenzione EF usa "Locations", quindi devi dirgli di cercare la tabella "Location".

visto che usi il nome singolare per le tabelle puoi usare:
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
Puoi iniziare leggendo questo

Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna.
-Albert Einstein-

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.