efcore code first 基本表处理


前言

使用code first自动生成数据表,如果有基础表的时候,基础表不需要code first 自动生成,这个时候就要想办法解决了,下面提供我的三个解决思路


方法一、直接sql查询

       通过sql查询,不通过efcore 进行查询,查询后的结果直接转成模型

 操作步骤

通过ef sql 查询进行查询       

var connection = _myContext.Database.GetDbConnection();
connection.Open();
var cmd = connection.CreateCommand();
cmd.CommandText = "SELECT * FROM AspNetUsers";
var reader = await cmd.ExecuteReaderAsync();
var list = ToList<IdentityUser>(reader);
reader.Close();
connection.Close();
return list;

这里提供toList的方法

private List<T> ToList<T>(DbDataReader dr) where T : class, new()
{
    var result = new List<T>();
    var properties = typeof(T).GetProperties().ToList();
    while (dr.Read())
    {
        var obj = new T();

        foreach (var property in properties)
        {
            try
            {
                if (ReaderExists(dr, property.Name.ToUpper()))
                {
                    //Oracle字段为大写
                    var id = dr.GetOrdinal(property.Name.ToUpper());
                    if (!dr.IsDBNull(id))
                    {
                        if (dr.GetValue(id) != DBNull.Value)
                        {
                            property.SetValue(obj, dr.GetValue(id));
                        }
                    }
                }
            }
            catch (Exception e)
            {

            }
        }

        result.Add(obj);
    }
    return result;
}
/// <summary>
/// 判断是否字段存在
/// </summary>
/// <param name="dr"></param>
/// <param name="columnName"></param>
/// <returns></returns>
private static bool ReaderExists(DbDataReader dr, string columnName)
{

    dr.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" +

    columnName + "'";

    return (dr.GetSchemaTable().DefaultView.Count > 0);

}

方法二、使用efcore模型查询

        定义好实体Configuration ,Dbset,进行code first 的时候先进行Add-Migration 接着删除 刚刚生成的 Migrations 里的文件 ,不需要Update-Database 操作,因为你的基础表是自己创建的,这样就可以使用ef模型进行查询了

操作步骤

modelBuilder.ApplyConfiguration(new IdentityUserConfiguration());

public DbSet<IdentityUser> IdentityUsers { get; set; }

找到刚刚生成的migration 删除掉

 

接着就可以使用ef 模型进行查询了

方法三、面向高版本efcore 

        EF Core 5.0 中引入了从迁移中排除表的功能。

modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers", t => t.ExcludeFromMigrations());

        此配置迁移不会创建 AspNetUsers 该表,但 IdentityUser 仍包含在模型中,并且可正常使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值