首页 > 学院 > 开发设计 > 正文

由code生成数据库model

2019-11-17 02:34:44
字体:
来源:转载
供稿:网友

由code生成数据库model

在做项目的时候,用到了entity framework,数据库是MySQL。以前一直是先建好DB model,然后项目中添加。但是之后改动db,又需要update。像同事学习了:code make db model。

需要的dll:MySql.data(6.9.5.0), MySql.data.Entity.EF6(6.9.5.0),

System.Data, System.Sata.DataSetExtension, System.Data.SQLite,System.Data.SQLite.EF6,System.Data.SQLite.Linq, EntityFramework, EntityFramework.SqlServer

config文件的连接字符串:

<connectionStrings> <add name="JobMasterDBConnection_MSSQL" connectionString="Data Source=EISCNG109WQS1;Initial Catalog=JobMaster;Integrated Security=True" PRoviderName="System.Data.SqlClient" /> <add name="JobMasterDBConnection_MYSQL" connectionString="Data Source=127.0.0.1; port=3306; Initial Catalog=JobMaster; uid=root; pwd=PassWord!01;" providerName="MySql.Data.MySqlClient" /> <add name="JobMasterDBConnection_SQLite" connectionString="Data Source=DB/JobMaster.local.db;" providerName="System.Data.SQLite.EF6" /> </connectionStrings>

Context和Migrations文件:

 1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Data; 5 using System.Data.Entity; 6 using System.Data.Entity.Migrations; 7 using System.Data.Entity.ModelConfiguration; 8 using System.Data.Entity.ModelConfiguration.Conventions; 9 using System.Linq;10 using System.Text;11 12 namespace JobMaster.Libs.Models.DBContext13 {14     //[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]15     internal class JobMasterDBContext : DbContext16     {17         #region "Fields"18         public const string CNSTR_CONNECTIONNAME = "JobDispatcher_Database_Entry";19         public const string CNSTR_CONNECTIONNAME_MSSQL = "JobMasterDBConnection_MSSQL";20         public const string CNSTR_CONNECTIONNAME_MYSQL = "JobMasterDBConnection_MYSQL";21         public const string CNSTR_CONNECTIONNAME_SQLITE = "JobMasterDBConnection_SQLite";22         #endregion23 24         #region "Constructs"25         public JobMasterDBContext()26             : this(ConfigurationManager.AppSettings[CNSTR_CONNECTIONNAME])27         { }28 29         public JobMasterDBContext(string connectionName)30             : base(connectionName)31         {32             this.Configuration.LazyLoadingEnabled = false;33             this.Configuration.ProxyCreationEnabled = false;34         }35 36         static JobMasterDBContext()37         {38             switch (ConfigurationManager.AppSettings[CNSTR_CONNECTIONNAME])39             {40                 case CNSTR_CONNECTIONNAME_MSSQL:41                     break;42                 case CNSTR_CONNECTIONNAME_MYSQL:43                     DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration());44                     Database.SetInitializer<JobMasterDBContext>(new MigrateDatabaseToLatestVersion<JobMasterDBContext, JobMaster.Libs.Models.Migrations.JobMasterDBConfiguration>());45                     break;46                 case CNSTR_CONNECTIONNAME_SQLITE:47                     //Database.SetInitializer<JobMasterDBContext>(new DropCreateDatabaseAlways<JobMasterDBContext>());48                     break;49             }50         }51         #endregion52 53         #region "Propertiess"54         public DbSet<Agent> Agents { get; set; }55 56         public DbSet<Job> Jobs { get; set; }57 58         public DbSet<TestCase> TestCases { get; set; }59 60         public DbSet<Task> Tasks { get; set; }61 62         public DbSet<TaskAssignment> TaskAssignments { get; set; }63         #endregion64 65         #region "Events"66         protected override void OnModelCreating(DbModelBuilder modelBuilder)67         {68             modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();69             modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();70 71             //modelBuilder.Entity<EntityType>().MapToStoredProcedures();72 73             modelBuilder.Entity<TestCase>().Property(p => p.TaskID).IsOptional();74             modelBuilder.Entity<Task>().HasMany(p => p.TestCases).WithOptional().HasForeignKey(p => p.TaskID);75         }76         #endregion77     }78 }
namespace JobMaster.Libs.Models.Migrations{    using System;    using System.Data.Entity;    using System.Data.Entity.Migrations;    using System.Linq;    internal sealed class JobMasterDBConfiguration : DbMigrationsConfiguration<JobMaster.Libs.Models.DBContext.JobMasterDBContext>    {        public JobMasterDBConfiguration()        {            AutomaticMigrationsEnabled = true;            switch (System.Configuration.ConfigurationManager.AppSettings[JobMaster.Libs.Models.DBContext.JobMasterDBContext.CNSTR_CONNECTIONNAME])            {                case JobMaster.Libs.Models.DBContext.JobMasterDBContext.CNSTR_CONNECTIONNAME_MSSQL:                    break;                case JobMaster.Libs.Models.DBContext.JobMasterDBContext.CNSTR_CONNECTIONNAME_MYSQL:                    SetSqlGenerator("MySql.Data.MySqlClient.EF6", new MySql.Data.Entity.MySqlMigrationSqlGenerator());                    break;                case JobMaster.Libs.Models.DBContext.JobMasterDBContext.CNSTR_CONNECTIONNAME_SQLITE:                    break;            }        }        protected override void Seed(JobMaster.Libs.Models.DBContext.JobMasterDBContext context)        {            //  This method will be called after migrating to the latest version.            //  You can use the DbSet<T>.AddOrUpdate() helper extension method             //  to avoid creating duplicate seed data. E.g.        }    }}

Model:

using System;using System.Collections;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.ComponentModel.DataAnnotations.Schema;using System.Linq;using System.Runtime.Serialization;using System.Text;using System.Threading.Tasks;using JobMaster.Libs.Models;using JobMaster.Libs.Models.ViewModels;using JobMaster.Libs.Utils;using JobMaster.Libs.Utils.Extensions;namespace JobMaster.Libs.Models{    [Table("tbl_Jobs")]    public class Job    {        #region "Constructs"        public Job() { }        #endregion        #region "Properties"        [Key]        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]        public long ID { get; set; }        [MaxLength(100)]        public string Name { get; set; }        [MaxLength(300)]        public string Description { get; set; }        public Nullable<bool> EnableSliceSet { get; set; }        public Nullable<int> MinialSliceSize { get; set; }        [Required]        [MaxLength(300)]        public string PrepConfig { get; set; }        public Nullable<int> Priority { get; set; }        public Nullable<JobType> JobType { get; set; }        public Nullable<JobStatus> Status { get; set; }        public Nullable<int> TotalCount { get; set; }        public Nullable<int> TotalSuccess { get; set; }        public Nullable<int> TotalFailure { get; set; }        public Nullable<int> TotalTimeout { get; set; }        public Nullable<System.DateTime> CreateTime { get; set; }        public Nullable<System.DateTime> StartTime { get; set; }        public Nullable<System.DateTime> EndTime { get; set; }        public Nullable<System.DateTime> UpdateTime { get; set; }        #endregion        #region "Properties"        public virtual ICollection<TestCase> TestCases { get; set; }        public virtual ICollection<Task> Tasks { get; set; }        #endregion    }}

如何使用:

JobMasterDBContext  dbcontext=new JobMasterDBContext();dbcontext.Jobs.add(new Job(){Name="test"});dbcontext.SaveChanges();

注意:在需要用到db 的项目中也需要添加以上Dll。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表