3104—EF Code记录

一、基本

      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 getColl = null;

                SqlParameter[] prams = new SqlParameter[]
                    {
                        new SqlParameter("@rolename",roleName)
                    };
                //无参数就正常,有参数报错
                //var lst= conn.Query(sql,prams);
                //不会报Invalid type owner for dynamicMethod
                var lst=this._db.Set().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 dbContextOption = new DbContextOptions();
                            DbContextOptionsBuilder dbContextOptionBuilder = new DbContextOptionsBuilder(dbContextOption);
                            BudgetBluePrintContext _dbContext = new BudgetBluePrintContext(dbContextOptionBuilder.UseSqlServer(<数据库连接字符串>).Options);

    这样生成的数据库上下文就可以随意使用了。

你可能感兴趣的:(NetCore,ASP.Net,NET,C#,c#,net,core,EF,code)