Skip to main content
 首页 » 编程设计

c#之EF Core 和封装的集合

2024年02月04日30Terrylee

我正在尝试遵循此处的建议: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 does not contain a definition for Entries".

我已经使用注释突出显示了错误行(由于编译错误,“条目”以红色下划线标出)。我花了几个小时在谷歌上搜索这个,但一无所获。请问我做错了什么?

更新 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 为空。现在看下面(当我在下一行停止调试器时):

请注意 Person.PersonSport.Sport 不再为空。

这是为什么?如何确保在填充 Person 变量时填充 Person.PersonSport.Sport?

请您参考如下方法:

看起来 nameof(Person.Entries) 是为了引用 Person 类,但实际上是在查看 Person 属性PersonSportContext 类,由于缺少名称间距。尝试在 nameof 运算符中添加 Person 类命名空间。

nameof(Person.Entries) 

应该变成

nameof(MyNamespaceWherePersonClassResides.Person.Entries)