我正在尝试遵循此处的建议: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)
