前言
使用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
仍包含在模型中,并且可正常使用。