.netcore基於mysql的codefirst
此文僅是對於netcore基於mysql的簡單的codefirst實現的簡單記錄。示例為客服系統消息模板的增刪改查實現
第一步、創建實體項目,並在其中建立對應的實體類,以及數據庫訪問類
須引入Pomelo.EntityFrameworkCore.MySql和Microsoft.EntityFrameworkCore
/// <summary> /// 消息模板 /// </summary> public class MessatgeTemplate { /// <summary> /// id /// </summary> [Key] public System.Guid Id { get; set; } /// <summary> /// 名稱 /// </summary> [MaxLength(250)] public string Name { get; set; } /// <summary> /// 關鍵字 /// </summary> [MaxLength(500)] public string Keywords { get; set; } /// <summary> /// 內容 /// </summary> public string Content { get; set; } /// <summary> /// 語言 /// </summary> [MaxLength(80)] public string CultureCode { get; set; } /// <summary> /// 類別 /// </summary> [MaxLength(250)] public string Category { get; set; } /// <summary> /// 備注信息 /// </summary> public string Remark { get; set; } /// <summary> /// 是否啟用 /// </summary> public bool Enabled { get; set; } /// <summary> /// 創建時間 /// </summary> public DateTime Created { get; set; } /// <summary> /// 最近修改時間 /// </summary> public DateTime LastModified { get; set; } }
/// <summary> /// /// </summary> public class CustomerServiceContext : DbContext { public CustomerServiceContext(DbContextOptions<CustomerServiceContext> options) : base(options) { } /// <summary> /// 配置 /// </summary> /// <param name="optionsBuilder"></param> protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); } public virtual DbSet<MessatgeTemplate> MessatgeTemplate { get; set; } }
第二步、創建業務服務項目,添加對應的業務處理類
/// <summary> /// 客服業務統一接口 /// </summary> public interface ICustomerServicerSerice { }
/// <summary> /// 模板業務類 /// </summary> public class MessageTemplateService : ICustomerServicerSerice { private CustomerServiceContext _CustomerServiceContext; public MessageTemplateService(CustomerServiceContext customerServiceContext) { this._CustomerServiceContext = customerServiceContext; } /// <summary> /// 創建模板 /// </summary> public void CreateMessageTemplate() { //todo create } /// <summary> /// 修改模板 /// </summary> public void ModifyMessageTemplate() { //TODO modified } /// <summary> /// 獲取模板 /// </summary> /// <returns></returns> public List<object> GetMessageTemplate() { //TODO根據傳入參數查詢模板 return null; } /// <summary> /// 刪除 /// </summary> public void DeleteMessageTemplate(Guid id) { var template = _CustomerServiceContext.MessatgeTemplate.FirstOrDefault(p => p.Id == id); if (template != null) { _CustomerServiceContext.MessatgeTemplate.Remove(template); _CustomerServiceContext.SaveChanges(); } } /// <summary> /// 批量設置是否可用 /// </summary> /// <param name="ids"></param> /// <param name="enabled"></param> public void BatchEnableTemplate(List<Guid> ids, bool enabled) { //TODO set enabled } }
第三步、創建webapi項目,並在其中建立對應的實體類,以及數據庫訪問類
須引入Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.Design.
1、在appsettings.json中配置數據連接
"ConnectionStrings": { "CumstomerServiceConnection": "server=localhost;port=3306;database=CustomerServiceCenter;uid=root;pwd=root23456;CharSet=utf8" }
2、修改startup.cs類的ConfigureServices注入db訪問類
services.AddDbContext<CustomerServiceContext>(p => p.UseMySql(Configuration.GetConnectionString("CumstomerServiceConnection")));
3、設置該webapi項目為啟動項目,在nuget程序包控制台選擇第一步中創建的實體類項目依次運行如下腳本創建數據庫
1)add-migration init
2) update-database
上面的兩個命令中,add-migration表示添加數據遷移,其實就是將實體變更轉換成sql(add-migraion后面的init只是個名稱,可以自行定義),update-database是將生成的數據遷移信息更新到數據庫
另外一些可能用到的命令
remove-migration ---將最近生成的遷移(沒有更新到數據庫的)移除掉
script-migration --生成數據庫遷移相應的腳本
------------------------
命令執行成功后,就可以在數據庫中找到創建好的數據庫和表了
script-datatable可以生成數據庫腳本語句
好了,以上就完成了codefirst的簡單操作了。不過跟着第二步的業務類其實沒啥關系!!!如果只是進行數據遷移確實沒有service層什么事,但是業務邏輯要走通,實現crud,業務層還是必須的。
---------------------------------------------------------------------------------------------------------------------
以下就順帶寫下controller中引入service,實現簡單的刪除業務邏輯(其它的業務邏輯---略)
在webapi創建MessageTemplateController
[Route("api/[controller]")] [ApiController] public class MessageTemplateController : ControllerBase { private MessageTemplateService _MessageTemplateService; public MessageTemplateController(MessageTemplateService messageTemplateService) { this._MessageTemplateService = messageTemplateService; } /// <summary> /// 刪除 /// </summary> /// <param name="id"></param> [HttpPost("DeleteMessageTemplate")] public void DeleteMessageTemplate(Guid id) { _MessageTemplateService.DeleteMessageTemplate(id); } //TODO其他操作:查詢,新增,修改等 }
修改Startup.cs類,注入服務
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddDbContext<CustomerServiceContext>(p => p.UseMySql(Configuration.GetConnectionString("CumstomerServiceConnection"))); #region 注入業務服務 Assembly assembly = Assembly.Load("Qingy.DotNetCoreStudy.CustomerServiceService"); List<Type> types = assembly.GetTypes().Where(u => u.IsClass && !u.IsAbstract && !u.IsGenericType && u.GetInterfaces().Any(p => p == typeof(ICustomerServicerSerice)) ).ToList(); foreach (var item in types) { services.AddTransient(item); } #endregion }
綜合以上,就可以將api到db的完整實現了。