赞
踩
一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少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的目录下。
代码:
/// <summary>
/// 数据库实体特性
/// </summary>
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;"
}
/// <summary> /// 创建实体 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(ModelBuilder modelBuilder) { #region 动态加入DbSet<T>属性 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<T>属性 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
{
/// <summary>
/// 主键
/// </summary>
[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 { /// <summary> /// 姓名 /// </summary> public string FName { get; set; } /// <summary> /// 编码 /// </summary> public string FNumber { get; set; } /// <summary> /// 备注 /// </summary> 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; } /// <summary> /// 行号 /// </summary> public int FSeq { get; set; } /// <summary> /// 数量 /// </summary> public decimal FQty { get; set; } /// <summary> /// 单价 /// </summary> public decimal FPrice { get; set; } /// <summary> /// 金额 /// </summary> public decimal FAmount { get; set; } } }
需要在程序包管理器控制台里执行同步更新的命令脚本,打开方式:
在执行命令前,我们先要了解一下命令的使用,要做到知其然,知其所以然。
注:每次只能执行一个命令,不允许多个命令同时执行。
初始化:
Add-Migration Initial
更新数据库:
Update-Database
具体的使用自行百度吧,这里就不再做阐述了。
结语:其实我是想使用动态更新实体对象与数据库实体表字段的,但是找了很久没有解决办法,就逼不得已先手敲命令行的方式来进行更新吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。