針對.net core EF框架下的CodeFirst實現(Webapi項目)
1、配置文件appsettings.json配置數據庫連接
"ConnectionStrings": {
"SOADBContext": "Data Source=.;Initial Catalog=RextecSOA;User=sa;Password=123456" //sqlserver
}
2、startup 數據庫連接
services.AddDbContext<SOADbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SOADBContext")));
3、IEntityTypeConfiguration 實現數據表映射
創建.net core 類庫 Rextec.SOA.Configuring
實現代碼:
數據表通用字段映射(基礎映射類)
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rextec.SOA.Repository;
namespace Rextec.SOA.Configuring
{
/// <summary>
/// 通用字段映射
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseConfiguring<T> : IEntityTypeConfiguration<T> where T : BaseModel
{
public virtual void Configure(EntityTypeBuilder<T> builder)
{
builder.HasKey(x => x.ID);
builder.Property(x => x.CreateUserID).HasMaxLength(50).IsRequired();
builder.Property(x => x.CreateUserName).HasMaxLength(50);
builder.Property(x => x.CreateTime).HasColumnType("datetime");
builder.Property(x => x.ModifyUserID).HasMaxLength(50);
builder.Property(x => x.ModifyUserName).HasMaxLength(50);
builder.Property(x => x.ModifyTime).HasColumnType("datetime");
}
}
}
以用戶表映射代碼
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Rextec.SOA.Repository;
namespace Rextec.SOA.Configuring
{
/// <summary>
/// 人員表映射
/// </summary>
public class UserInfoConfiguring:BaseConfiguring<UserInfo>
{
public override void Configure(EntityTypeBuilder<UserInfo> builder)
{
builder.Property(x => x.UserName).HasMaxLength(50);
builder.Property(x => x.LoginAccount).HasMaxLength(50);
builder.Property(x => x.LoginPassword).HasMaxLength(50);
builder.Property(x => x.Tel).HasMaxLength(50);
builder.Property(x => x.Email).HasMaxLength(50);
builder.Property(x => x.Sex).HasMaxLength(50);
builder.Property(x => x.IsEnable).HasMaxLength(1);
builder.Property(x => x.DataLimit).HasMaxLength(1);
builder.Property(x => x.IsAdmin).HasMaxLength(1);
}
}
}
通用字段實體類對象代碼
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
namespace Rextec.SOA.Repository
{
/// <summary>
/// 通用字段實體類
/// </summary>
public abstract class BaseModel
{
/// <summary>
/// 主鍵
/// </summary>
[Key,StringLength(50)]
public string ID { get; set; } = Guid.NewGuid().ToString();
/// <summary>
/// 創建人
/// </summary>
[Required,StringLength(50)]
public string CreateUserID { get; set; }
/// <summary>
/// 創建人姓名
/// </summary>
public string CreateUserName { get; set; }
/// <summary>
/// 創建時間
/// </summary>
public DateTime CreateTime { get; set; } = DateTime.Now;
/// <summary>
/// 修改人ID
/// </summary>
public string ModifyUserID { get; set; }
/// <summary>
/// 修改人姓名
/// </summary>
public string ModifyUserName { get; set; }
/// <summary>
/// 修改日期
/// </summary>
public DateTime? ModifyTime { get; set; }
}
}
人員實體類對象代碼
using System.ComponentModel.DataAnnotations.Schema;
namespace Rextec.SOA.Repository
{
/// <summary>
/// 用戶信息表
/// </summary>
[Table("UserInfo")]
public class UserInfo:BaseModel
{
/// <summary>
/// 用戶名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 登錄名
/// </summary>
public string LoginAccount { get; set; }
/// <summary>
/// 登錄密碼
/// </summary>
public string LoginPassword { get; set; }
/// <summary>
/// 聯繫電話
/// </summary>
public string Tel { get; set; }
/// <summary>
/// 郵箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 性別 0:男 1:女
/// </summary>
public string Sex { get; set; }
/// <summary>
/// 性別描述
/// </summary>
[NotMapped]
public string SexDescrib { get { return Sex == "0" ? "男" : (Sex == "1" ? "女" : ""); } }
/// <summary>
/// 是否可用 0 否 1:是 默認可用
/// </summary>
public int IsEnable { get; set; } = 1;
/// <summary>
/// 用戶數據權限 1:本人 2:不限
/// </summary>
public int DataLimit { get; set; }
/// <summary>
/// 是否管理員 0:否 1:是 默認否
/// </summary>
public int IsAdmin { get; set; }
}
}
4、數據庫上下文代碼
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace Rextec.SOA.Repository
{
/// <summary>
/// 數據庫上下文
/// </summary>
public class SOADbContext:DbContext
{
/// <summary>
///
/// </summary>
/// <param name="options"></param>
public SOADbContext(DbContextOptions<SOADbContext> options):base(options)
{
//Database.Migrate();//如果數據庫不存在,則創建數據庫(migrations創建)
Database.EnsureCreated();//如果數據庫不存在則創建則創建數據庫
}
#region dbSet
public virtual DbSet<UserInfo> UserInfos { get; set; }
#endregion
/// <summary>
/// 數據庫表初始化
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
try
{
//modelBuilder.ApplyConfiguration(new UserInfoConfiguring());//單個文件映射
//var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);
string path = AppDomain.CurrentDomain.BaseDirectory;
var files = Directory.GetFiles(path, "Rextec.SOA.Configuring.dll");
if (files.Length > 0)
{
var typesToRegister = Assembly.LoadFile(files[0]).GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null);
foreach (var type in typesToRegister)
{
if (!type.FullName.Contains("BaseConfiguring"))
{
dynamic configurationInstance = Activator.CreateInstance(type);
modelBuilder.ApplyConfiguration(configurationInstance);
}
}
}
}
catch (Exception ex)
{
}
}
}
}
親測:
使用Postman 調用接口;數據庫不存在時,會自動創建數據庫
自動創建的數據表如下