EF Core и инкапсулированная коллекция - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь следовать совету здесь: 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");
        }

Пожалуйста, смотрите скриншот ниже:

enter image description here

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

enter image description here

Обратите внимание, что Person.PersonSport.Sport больше не равен нулю.

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

1 Ответ

0 голосов
/ 27 августа 2018

Похоже, что nameof(Person.Entries) предназначен для ссылки на класс Person, но на самом деле рассматривает свойство Person класса PersonSportContext из-за отсутствия пространства имен. Попробуйте добавить пространство имен класса Person в оператор nameof.

nameof(Person.Entries)

должно стать

nameof(MyNamespaceWherePersonClassResides.Person.Entries)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...