Я пытаюсь следовать совету здесь: https://ardalis.com/encapsulated-collections-in-entity-framework-core
У меня есть класс, который выглядит так:
public class Person
{
public Guid Id { get; private set; }
public string Name { get; private set; }
private readonly List<PersonSport> _entries = new List<PersonSport>();
public IEnumerable<PersonSport> Entries => _entries.AsReadOnly();
public void AddEntry(PersonSport entry)
{
_entries.Add(entry);
}
}
и dbcontext, который выглядит так:
public class PersonSportContext : DbContext
{
public DbSet<Person> Person { get; set; }
public DbSet<Sport> Sport{ get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PersonSport>().HasKey(sc => new { sc.PersonId, sc.SportId });
modelBuilder.Entity<Sport>()
.ToTable("Sport")
.HasDiscriminator<string>("SportType")
.HasValue<Football>("Football")
.HasValue<Running>("Running");
modelBuilder.Entity<PersonSport>()
.HasOne<Person>(sc => sc.Person)
.WithMany(s => s.PersonSport)
.HasForeignKey(sc => sc.PersonId);
modelBuilder.Entity<PersonSport>()
.HasOne<Sport>(sc => sc.Sport)
.WithMany(s => s.PersonSport)
.HasForeignKey(sc => sc.SportId);
var navigation = modelBuilder.Entity<Person>().Metadata.FindNavigation(nameof(ConsoleApp1.Person.PersonSport));
navigation.SetPropertyAccessMode(PropertyAccessMode.Field);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=PersonSport;Trusted_Connection=True;MultipleActiveResultSets=true");
}
Я вижу ошибку компиляции:
«DbSet не содержит определения для записей».
Я выделил строку, в которой ошибки при использовании комментария («Записи» подчеркнуты красным из-за ошибки компиляции). Я часами гуглил это и ничего не получил. Что я делаю не так, пожалуйста?
Обновление
Ответ cwharris помог с ошибкой компиляции. Теперь он работает. Я создал консольное приложение для его проверки:
static void Main(string[] args)
{
PersonSportContext personSportContext = new PersonSportContext();
var person = personSportContext.Person.Include(t => t.PersonSport).FirstOrDefault();
var sport = personSportContext.Sport.Include(t => t.PersonSport).FirstOrDefault();
Console.WriteLine("Finished");
}
Пожалуйста, смотрите скриншот ниже:

Обратите внимание, что Person.PersonSport.Sport имеет значение null. Теперь смотрите ниже (когда я останавливаю отладчик в следующей строке):

Обратите внимание, что Person.PersonSport.Sport больше не равен нулю.
Почему это? Как я могу гарантировать, что Person.PersonSport.Sport будет опосредован при заполнении переменной Person?