一:在EntityFramework项目中创建类如:ZSWDbContext。
public classZSWDbContext : AbpDbContext
{public ZSWDbContext() : base("ZSWConnectionString")
{//这里设置不会执行//Database.SetInitializer(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 classAmoiDataModule : AbpModule
{public override voidPreInitialize()
{
Database.SetInitializer(new CreateDatabaseIfNotExists());
Database.SetInitializer(null);
Configuration.DefaultNameOrConnectionString= "Default";
}public override voidInitialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}
三:在Core项目中定义执行Sql的接口:
public interfaceISqlExecuter
{///
///执行给定的命令///
/// 命令字符串
/// 要应用于命令字符串的参数
/// 执行命令后由数据库返回的结果
int Execute(string sql, params object[] parameters);///
///创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。///
/// 查询所返回对象的类型
/// SQL 查询字符串
/// 要应用于 SQL 查询字符串的参数
///
IQueryable SqlQuery(string sql, params object[] parameters);
}
然后在EntityFramework中实现该接口:
public classSqlExecuter : ISqlExecuter, ITransientDependency
{private readonly IDbContextProvider_dbContextProvider;public SqlExecuter(IDbContextProviderdbContextProvider)
{
_dbContextProvider=dbContextProvider;
}///
///执行给定的命令///
/// 命令字符串
/// 要应用于命令字符串的参数
/// 执行命令后由数据库返回的结果
public int Execute(string sql, params object[] parameters)
{return_dbContextProvider.GetDbContext().Database.ExecuteSqlCommand(sql, parameters);
}///
///创建一个原始 SQL 查询,该查询将返回给定泛型类型的元素。///
/// 查询所返回对象的类型
/// SQL 查询字符串
/// 要应用于 SQL 查询字符串的参数
///
public IQueryable SqlQuery(string sql, params object[] parameters)
{return _dbContextProvider.GetDbContext().Database.SqlQuery(sql, parameters).AsQueryable();
}
}
四:在构造函数中注入:
private readonlyISqlExecuter _sqlExecuter;publicAppService(ISqlExecuter sqlExecuter)
{
_sqlExecuter=sqlExecuter;
}
然后调用存储过程:
const string sql = "dbo.ResourceDataSync @STATION";var list = _sqlExecuter.SqlQuery(sql, new SqlParameter("@STATION", "石家庄站")).ToList();
注意的地方:
ABP默认是开启事务的,如果在Service中同时调用不同的数据库,会出现
服务器×××上的MSDTC不可用解决办法 错误,关闭事务即可解决:
[UnitOfWork(isTransactional: false)]
参考博客: