求这段OleDb数据查询代码的Entity Framework等效实现
用Entity Framework实现等效功能的分步指南
嘿,刚上手EF的话,你会发现它比直接写OleDb代码简洁安全多了,还能帮你自动处理资源释放(比如数据库连接),也避免了SQL注入风险。咱们一步步把你的原有代码转换成EF版本:
第一步:创建EF实体类和DbContext
首先你需要把数据库里的tbPeople表映射成一个C#实体类,再创建一个继承自DbContext的上下文类来管理数据库连接和操作:
// 对应tbPeople表的实体类 public class Person { // 假设表中有主键列(比如Id),EF需要主键来跟踪实体 public int Id { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public string Country { get; set; } // 表中其他列也可以在这里添加对应的属性 } // EF上下文类,负责数据库交互 public class PeopleDbContext : DbContext { // 配置数据库连接字符串(和你原来的DBConString一致) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 如果是SQL Server数据库用这句 optionsBuilder.UseSqlServer(WindowsFormsApplication2.Properties.Settings.Default.DBConString); // 如果是Access数据库,替换成下面这句: // optionsBuilder.UseOleDb(WindowsFormsApplication2.Properties.Settings.Default.DBConString); } // 对应tbPeople表的DbSet,EF通过它操作表数据 public DbSet<Person> People { get; set; } }
第二步:重写按钮点击事件的逻辑
现在你可以用EF来替换原来的OleDb代码,逻辑更清晰,还自动处理资源:
private void btn_clicked(object sender, EventArgs e) { // 先清空目标文本框,避免每次点击都追加旧内容 textboxTest.Text = string.Empty; // using块会自动释放上下文资源,不用手动关闭数据库连接 using (var context = new PeopleDbContext()) { // EF会自动生成参数化查询,彻底避免SQL注入风险! var peopleFromCountry = context.People .Where(person => person.Country == textbox.Text) .ToList(); // 拼接姓名并显示到文本框 foreach (var person in peopleFromCountry) { textboxTest.Text += $"{person.LastName}, {person.FirstName}\n"; } } }
额外的优化小提示
- 你的原有代码里有几个大小写错误:
textboxTest.text应该是Text(C#大小写敏感),read["lastname"].toString()应该是ToString(),EF版本里已经修正了这些细节。 - 如果查询的数据量较大,建议用异步查询提升UI响应速度,避免界面卡顿:
private async void btn_clicked(object sender, EventArgs e) { textboxTest.Text = string.Empty; using (var context = new PeopleDbContext()) { var peopleFromCountry = await context.People .Where(person => person.Country == textbox.Text) .ToListAsync(); foreach (var person in peopleFromCountry) { textboxTest.Text += $"{person.LastName}, {person.FirstName}\n"; } } }
内容的提问来源于stack exchange,提问作者allen
相关产品推荐
相关产品推荐

