一:在EntityFramework項目中創建類如:ZSWDbContext。
public class ZSWDbContext : AbpDbContext { public ZSWDbContext() : base("ZSWConnectionString") { //這里設置不會執行 //Database.SetInitializer<ZSWDbContext>(null); } }
二:在DataModule.cs類中設置DbContext在項目啟動時不檢測數據庫的一致性。
否則會報The model backing the 'ApplicationDbContext' context has changed since the database was created. Consider using Code First Migrations to update錯誤。
[DependsOn(typeof(AbpZeroEntityFrameworkModule), typeof(AmoiCoreModule))] public class AmoiDataModule : AbpModule { public override void PreInitialize() { Database.SetInitializer(new CreateDatabaseIfNotExists<AmoiDbContext>()); Database.SetInitializer<ZSWDbContext>(null); Configuration.DefaultNameOrConnectionString = "Default"; } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
三:在Core項目中定義執行Sql的接口:
public interface ISqlExecuter { /// <summary> /// 執行給定的命令 /// </summary> /// <param name="sql">命令字符串</param> /// <param name="parameters">要應用於命令字符串的參數</param> /// <returns>執行命令后由數據庫返回的結果</returns> int Execute(string sql, params object[] parameters); /// <summary> /// 創建一個原始 SQL 查詢,該查詢將返回給定泛型類型的元素。 /// </summary> /// <typeparam name="T">查詢所返回對象的類型</typeparam> /// <param name="sql">SQL 查詢字符串</param> /// <param name="parameters">要應用於 SQL 查詢字符串的參數</param> /// <returns></returns> IQueryable<T> SqlQuery<T>(string sql, params object[] parameters); }
然后在EntityFramework中實現該接口:
public class SqlExecuter : ISqlExecuter, ITransientDependency { private readonly IDbContextProvider<ZSWDbContext> _dbContextProvider; public SqlExecuter(IDbContextProvider<ZSWDbContext> dbContextProvider) { _dbContextProvider = dbContextProvider; } /// <summary> /// 執行給定的命令 /// </summary> /// <param name="sql">命令字符串</param> /// <param name="parameters">要應用於命令字符串的參數</param> /// <returns>執行命令后由數據庫返回的結果</returns> public int Execute(string sql, params object[] parameters) { return _dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(sql, parameters); } /// <summary> /// 創建一個原始 SQL 查詢,該查詢將返回給定泛型類型的元素。 /// </summary> /// <typeparam name="T">查詢所返回對象的類型</typeparam> /// <param name="sql">SQL 查詢字符串</param> /// <param name="parameters">要應用於 SQL 查詢字符串的參數</param> /// <returns></returns> public IQueryable<T> SqlQuery<T>(string sql, params object[] parameters) { return _dbContextProvider.GetDbContext().Database.SqlQuery<T>(sql, parameters).AsQueryable(); } }
四:在構造函數中注入:
private readonly ISqlExecuter _sqlExecuter; public AppService(ISqlExecuter sqlExecuter) { _sqlExecuter = sqlExecuter; }
然后調用存儲過程:
const string sql = "dbo.ResourceDataSync @STATION"; var list = _sqlExecuter.SqlQuery<ResourceDataListDto>(sql, new SqlParameter("@STATION", "石家庄站")).ToList();
注意的地方:
ABP默認是開啟事務的,如果在Service中同時調用不同的數據庫,會出現
服務器×××上的MSDTC不可用解決辦法 錯誤,關閉事務即可解決:
[UnitOfWork(isTransactional: false)]
參考博客:
https://www.cnblogs.com/farb/p/sqlqueryinef.html
https://www.cnblogs.com/chiakiyu/p/5590211.html
