You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一解决方案多项目中复用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:40:17