【发布时间】:2021-01-14 13:45:13
【问题描述】:
我正在使用 .Net Core 5.0 和 Entity Framework,但我遇到了 .Include() 问题,它返回的是空列表。
以下是课程:
public class Contact
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get; set; }
public string Address { get; set; }
public string Email { get; set; }
public string MobilePhoneNumber { get; set; }
public ICollection<ContactSkill> ContactSkills { get; set; }
}
public class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public int ExpertiseLevel { get; set; }
public ICollection<ContactSkill> ContactSkills { get; set; }
}
public class ContactSkill
{
public int Id { get; set; }
public int ContactId { get; set; }
public int SkillId { get; set; }
public Contact Contact { get; set; }
public Skill Skill { get; set; }
}
还有 DbContext:
public class APIContext : DbContext
{
public APIContext(DbContextOptions<APIContext> options) : base(options)
{
}
public DbSet<Contact> Contacts { get; set; }
public DbSet<Skill> Skills { get; set; }
public DbSet<ContactSkill> ContactSkills { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>().ToTable("Contacts");
modelBuilder.Entity<Skill>().ToTable("Skills");
modelBuilder.Entity<ContactSkill>().ToTable("ContactSkills");
}
}
联系人和技能都正确填写,但是当我添加包含时,它是空的:
var contact = await _context.Contacts
.Include(c => c.ContactSkills)
.ThenInclude(cs => cs.Skill)
.AsNoTracking()
.FirstOrDefaultAsync(m => m.Id == id);
DbInitializer.cs:
public static void Initialize(APIContext context)
{
context.Database.EnsureCreated();
// Look for any contacts.
if (context.Contacts.Any())
{
return; // DB has been seeded
}
var contacts = new Contact[]
{,
new Contact{ FirstName = "Sam", LastName = "Gamegi", FullName = "Sam Gamegi", Address = "The Shire", Email = "frodon.baggins@shire.middleearth", MobilePhoneNumber = "+11 0 98 76 54 32" },
new Contact{ FirstName = "Samus", LastName = "Samus Aran", FullName = "Samus Aran", Address = "Space", Email = "samus.aran@metroid.com", MobilePhoneNumber = "+66 1 23 45 76 90" },
new Contact{ FirstName = "Frodon", LastName = "Baggins", FullName = "Frodon Baggins", Address = "The Shire", Email = "frodon.baggins@shire.middleearth", MobilePhoneNumber = "+11 0 98 76 54 32" },
};
// Look for any skills.
if (context.Skills.Any())
{
return; // DB has been seeded
}
var skills = new Skill[]
{
new Skill{ Name = ".Net Framework", ExpertiseLevel = 75},
new Skill{ Name = "SQL", ExpertiseLevel = 80},
new Skill{ Name = "Bounty Hunter", ExpertiseLevel = 100},
new Skill{ Name = "Ring Bearer", ExpertiseLevel = 100}
};
foreach (var s in skills)
{
context.Skills.Add(s);
}
context.SaveChanges();
// Look for any contact's skills.
if (context.ContactSkills.Any())
{
return; // DB has been seeded
}
var contactSkills = new ContactSkill[]
{
new ContactSkill{ ContactId = 1, SkillId = 1},
new ContactSkill{ ContactId = 1, SkillId = 2},
new ContactSkill{ ContactId = 2, SkillId = 3},
new ContactSkill{ ContactId = 3, SkillId = 4},
};
foreach (var cs in contactSkills)
{
context.ContactSkills.Add(cs);
}
context.SaveChanges();
}
我想我的数据库已创建,因为我看到了数据,但我在 SQL Explorer 中看不到我的数据库。
【问题讨论】:
-
您是否发布了真实的 dbcontext 或者这只是一个示例?
-
我认为您需要为 ICollection 属性添加 virtual 关键字或在 onModelCreating 函数中配置多对多关系。这将帮助您配置多对多关系。 learnentityframeworkcore.com/configuration/…
-
您的
.ThenInclude肯定没有正确使用。你能把它删掉,看看ContactSkills是不是还是空的吗? -
@Sergey:是的,它是完整的 DbContext。我正在对此进行试验,第一次从头开始创建 API。
-
@AbdulG : 试过了,列表还是空的。
标签: asp.net-core entity-framework-core