同一解决方案多项目中复用EF Database Context的问题求助
问题背景与需求
我正在开发一个PDF/文档生成程序,包含自动化处理和前端手动编辑两个场景,对应解决方案里的两个项目:RefundTracker(自动化模块)和MailMergeTPA(手动编辑模块)。由于两个流程共用相同的数据模型和模板,我希望只维护一套模型和模板。
目前Database Context及所有数据模型都位于RefundTracker项目中,我已为MailMergeTPA添加了该项目的引用,但在MailMergeTPA中使用上下文查询时无结果返回(比如调用获取银行详情的函数,在RefundTracker里能拿到完整数据,在MailMergeTPA里返回空)。同时我希望两个项目能复用数据查询类的函数(如示例中的GetBankDetails)。
现有代码
1. Database Context 代码
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RefundTracker.Models { public class DatabaseContext : DbContext { public DatabaseContext() :base("Prod") { } public DbSet<Referral> Referrals { set; get; } public DbSet<ReferralAppointment> ReferralAppointments { set; get; } public DbSet<ReferralPayment> ReferralPayments { set; get; } public DbSet<BankDetails> BankDetails { set; get; } public DbSet<ReferralAppointment_History> ReferralAppointment_History { set; get; } public DbSet<ReferralPayment_History> ReferralPayment_History { set ; get; } public DbSet<IsInUse> IsInUse { set; get; } } }
2. 示例查询函数(当前位于RefundTracker中)
public BankDetails GetBankDetails(Referral record) { string bName = record.bankName.Trim(); try { // 注:原代码存在变量重复定义问题,保留原结构展示 BankDetails bankDetails= new BankDetails(); List<BankDetails> bankDetails = new List<BankDetails>(); using (DatabaseContext db = new DatabaseContext()) { bankDetails = db.BankDetails.SingleOrDefault(a => a.BankName == bName); } return bankDetails; } catch(Exception ex) { Console.WriteLine(ex.ToString()); return null; } }
解决方案
1. 解决跨项目查询无结果问题
跨项目使用DbContext无结果的核心原因是连接字符串配置缺失:
RefundTracker项目的App.config/Web.config中存在名为Prod的连接字符串,但MailMergeTPA项目的配置文件中没有该配置,导致EF无法正确连接数据库。- 解决方法:将
RefundTracker里的<connectionStrings>节点完整复制到MailMergeTPA项目的App.config/Web.config中。
2. 实现模型与业务逻辑的复用
不要将数据访问逻辑绑定在单个项目中,建议拆分出独立类库项目(如命名为CommonDataAccess):
- 将所有模型类(
Referral、BankDetails等)和DatabaseContext迁移到这个类库项目中。 - 将通用数据查询函数(如
GetBankDetails)封装到类库的服务类中(比如BankDataService)。 - 让
RefundTracker和MailMergeTPA两个项目都引用这个类库项目。
这样做的优势:
- 仅维护一套模型和数据访问逻辑,避免重复代码。
- 后续修改模型或查询逻辑时,只需更新类库,两个项目自动同步变更。
3. 修复示例代码中的语法错误
原示例函数存在变量重复定义的问题,修正后的代码如下:
public BankDetails GetBankDetails(Referral record) { string bName = record.bankName.Trim(); try { using (DatabaseContext db = new DatabaseContext()) { return db.BankDetails.SingleOrDefault(a => a.BankName == bName); } } catch(Exception ex) { Console.WriteLine(ex.ToString()); return null; } }
内容的提问来源于stack exchange,提问作者JuanSwanepoel
相关产品推荐
相关产品推荐

