Affrontare uno strano problema con EF Core 2.
Il mio modello di contatto:
public class Contact
{
public int Id { get; set; }
public int ExternalCustomerKey { get; set; }
public string Firstname { get; set; }
public string Surname { get; set; }
public DateTime DateOfBirth { get; set; }
public string Postcode { get; set; }
public DateTime WhenCreated { get; set; }
public List<ContactPreference> Preferences { get; set; }
}
Modello ContactPreferene:
public class ContactPreference
{
public int Id { get; set; }
public int PreferenceTypeId { get; set; }
public DateTime WhenCreated { get; set; }
public DateTime LastModified { get; set; }
public int CustomerId { get; set; }
public Contact Contact { get; set; }
}
Recupero dei contatti dal database:
using (var context = new PreferenceServiceContext(_options))
{
var repository = new ContactRepository(context);
var contact = repository.FindContact(1);
}
Il contatto viene restituito con le preferenze come null:
Ispezionando il contesto del database, le preferenze vengono caricate:
E poi le preferenze vengono caricate nel contatto:
Se non ispeziono il contesto, le preferenze saranno nulle. Qualcuno si imbatte in questo o qualsiasi suggerimento per favore. Grazie
Aggiornare:
Aggiornamento 1:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// -- Map relationships
modelBuilder.Entity<Contact>(entity =>
{
entity.ToTable("Contact", "Preference");
entity.HasKey(e => e.Id);
entity.Property(e => e.ExternalCustomerKey).HasColumnName("ExternalCustomerKey");
entity.Property(e => e.Firstname).HasColumnName("Firstname");
entity.Property(e => e.Surname).HasColumnName("Surname");
entity.Property(e => e.DateOfBirth).HasColumnName("DateOfBirth");
entity.Property(e => e.Postcode).HasColumnName("Postcode");
entity.Property(e => e.WhenCreated).HasColumnName("WhenCreated");
entity.HasMany(e => e.Preferences).WithOne(e => e.Contact);
});
modelBuilder.Entity<ContactPreference>(entity =>
{
entity.ToTable("ContactPreference", "Preference");
entity.HasKey(e => e.Id);
entity.Property(e => e.CustomerId).HasColumnName("CustomerId");
entity.Property(e => e.PreferenceTypeId).HasColumnName("PreferenceTypeId");
entity.Property(e => e.WhenCreated).HasColumnName("WhenCreated");
entity.Property(e => e.LastModified).HasColumnName("LastModified");
entity.Property(e => e.AgentId).HasColumnName("AgentId");
entity.HasOne(e => e.Contact).WithMany(e => e.Preferences);
});
Ispezionando il contesto del database, le preferenze vengono caricate:
Enumerando il contesto.ContactPreferences DbSet fa sì che vengano recuperati dal database nella cache di DbContext. Quando in seguito si recupera un contatto, EF "aggiusta" la proprietà di navigazione Preferenze in modo che contenga gli oggetti ContactPreference già recuperati. Vedi https://docs.microsoft.com/en-us/ef/core/querying/tracking
Le entità correlate non vengono caricate a meno che tu non lo richieda. Ecco come richiederlo: https://docs.microsoft.com/en-us/ef/core/querying/related-data
Hai un membro di ContactPreferences
da qualche parte, che è diverso da yourContact.Preferences
. Sarà necessario utilizzare yourContact.ContactPreferences
anziché yourContact.Preferences
se ContactPreferences
è membro di Contact
.