一、基本
? ? ? 1—建立数据库上下文和表实体 ? ? ? ?使用nuget引入Microsoft.EntityframeworkCore.sqlserver和Microsoft.Entityframeworkcore.tools组件。
Scaffold-DbContext -Force “Server=服务器名;Database=数据库名;uid=账户;Password=密码;” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models/DataModels
--Models/DataModels为实体和上下文存储位置
? ? ? 2—更新ef ORM实体报错
? ? ? 处理办法:解决方案中包含xunit项目(其中引用了DbContext),在解决方案中删除xunit项目,后Scaffold-Dbcontext成功。
? ? ? 3—Dapper执行原生SQL语句
? ? ? 需要引入nuget包。包括:DapperExtensions。现版本1.5.0? ? ??
using Dapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.Data.SqlClient;
using (DbConnection conn = this._db.Database.GetDbConnection())
{
await conn.OpenAsync();
string sql = "SELECT * from v_role_business WHERE RoleName=@rolename";
List<VRoleBusiness> getColl = null;
SqlParameter[] prams = new SqlParameter[]
{
new SqlParameter("@rolename",roleName)
};
//无参数就正常,有参数报错
//var lst= conn.Query<VRoleBusiness>(sql,prams);
//不会报Invalid type owner for dynamicMethod
var lst=this._db.Set<VRoleBusiness>().FromSqlRaw(sql,prams);
if (lst != null)
{
getColl = lst.ToList();
result.Message = "Data-" + getColl.Count;
}
result.Success = true;
result.Entity = getColl;
await conn.CloseAsync();
}
? ? ?注意-1:如果查询返回的类型为自定义viewModel类型,则set<>().FromSqlRaw()会报错;使用第一种语句形式则正常。
三、手动建立DbContext
? ? 在startup.cs中的ConfigureServices设置好addDbcontext的注入后,在Controller中会自动注入Dbcontext上下文。
? ? 实际开发中,在BLL、DAL中则没有自动注入功能,这时需要手动建立数据库上下文。? ??
DbContextOptions<BudgetBluePrintContext> dbContextOption = new DbContextOptions<BudgetBluePrintContext>();
DbContextOptionsBuilder<BudgetBluePrintContext> dbContextOptionBuilder = new DbContextOptionsBuilder<BudgetBluePrintContext>(dbContextOption);
BudgetBluePrintContext _dbContext = new BudgetBluePrintContext(dbContextOptionBuilder.UseSqlServer(<数据库连接字符串>).Options);
? ? 这样生成的数据库上下文就可以随意使用了。
|