一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。
1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。
2、提升了开发效率,不需要在编写Sql脚本,但是有些特殊Sql脚本EF无法实现,需要我们自己编写(通过EF中的ExecuteSqlCommand实现插入、修改、删除、SqlQuery执行查询)。
3、EF提供的模型设计器十分强大,可以让我们清晰的指定或者查看表与表之间的关系(一对多,多对多…)。
4、EF提供的导航属性十分好用。
5、EF的延迟查询加载机制,数据在用到的时候才会去数据库查询。
1、性能差(生成Sql脚本阶段),在复杂查询的时候生成的脚本不是很高。
2、第一次执行时会有预热,预热时性能较差,不过将映射关系加载到内存之后就会好很多。
3、对于大批量的数据操作效率比较慢。
作用:因为我希望是动态将实体类与数据库实体表关联关系建立起来,所以我使用属性特性的方式来实现,只更新同步有此特性的实体类到数据库实体表。
文件目录:放置在Models/Attribute的目录下。
代码:
///
/// 数据库实体特性
///
public class DBEntityAttribute: Attribute
{
}
"ConnectionStrings": {
"DemoContext": "Server=127.0.0.1,1433;DataBase=WebApiDemo;User ID=sa;Password=sa;TrustServerCertificate=true;Trust Server Certificate=true;"
}
///
/// 创建实体
///
///
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region 动态加入DbSet属性
var assembly = Assembly.GetExecutingAssembly();
foreach (Type type in assembly.ExportedTypes)
{
if (type.IsClass && type.GetCustomAttribute<DBEntityAttribute>() != null)
{
var method = modelBuilder.GetType().GetMethods().Where(x => x.Name == "Entity").FirstOrDefault(); //得到当前对象的实体
if (method != null)
{
//加入DbSet属性
method = method.MakeGenericMethod(new Type[] { type });
method.Invoke(modelBuilder, null);
}
}
}
#endregion
base.OnModelCreating(modelBuilder);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//base.OnConfiguring(optionsBuilder);
//获取配置文件对象
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
//注入使用DemoContext连接串
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DemoContext"));
}
基础类:
using System.ComponentModel.DataAnnotations;
namespace ASP.NETCoreApi.Models
{
public class EntityBase
{
///
/// 主键
///
[Key]
public int FID { get; set; }
}
}
注:加入 Key 特性,则会在数据库中自动设置为自增长主键。
实体类主表:
using System.ComponentModel.DataAnnotations.Schema;
namespace ASP.NETCoreApi.Models
{
[DBEntity]
[Table("T_WDQ_DemoTable")]
public class DemoTable:EntityBase
{
///
/// 姓名
///
public string FName { get; set; }
///
/// 编码
///
public string FNumber { get; set; }
///
/// 备注
///
public string FRemark { get; set; }
}
}
实体类子表:
using System.ComponentModel.DataAnnotations.Schema;
namespace ASP.NETCoreApi.Models
{
[DBEntity]
[Table("T_WDQ_DemoTableEntry")]
public class DemoTableEntry: EntryEntityBase
{
public DemoTable DemoTable { get; set; }
///
/// 行号
///
public int FSeq { get; set; }
///
/// 数量
///
public decimal FQty { get; set; }
///
/// 单价
///
public decimal FPrice { get; set; }
///
/// 金额
///
public decimal FAmount { get; set; }
}
}
需要在程序包管理器控制台里执行同步更新的命令脚本,打开方式:
在执行命令前,我们先要了解一下命令的使用,要做到知其然,知其所以然。
注:每次只能执行一个命令,不允许多个命令同时执行。
初始化:
Add-Migration Initial
Update-Database
具体的使用自行百度吧,这里就不再做阐述了。
结语:其实我是想使用动态更新实体对象与数据库实体表字段的,但是找了很久没有解决办法,就逼不得已先手敲命令行的方式来进行更新吧。