Asp.net core 通过Models 生成数据库的方法

    其实Getting Started当中有着详细的说明,https://docs.efproject.net/en/latest/platforms/aspnetcore/new-db.html。但是有网友问道,就说一下好了。

  1. 新建项目,Asp.net core,选择不适用身份验证。
  2. 添加项目引用。这里还是使用postgreSql。

    在Nuget 控制台中输入命令:

    Install-Package Npgsql.EntityFrameworkCore.PostgreSQL

    Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

    添加这两个依赖

    然后手动在Tools 节点中加上 "Microsoft.EntityFrameworkCore.Tools""1.0.0-preview2-final",

    这里发现Tools –Pre就可以正常使用nuget安装,昨天直接获取版本安装失败,看来还是nuget同步问题。

  3. 创建Model类 Blogs,Post和DBContext

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Threading.Tasks;

     

    namespace PostgreSqlDemo2.Models

    {

    public class Blog

    {

    public int BlogId { getset; }

    public string Url { getset; }

     

    public List<Post> Posts { getset; }

    }

    }

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Threading.Tasks;

     

    namespace PostgreSqlDemo2.Models

    {

    public class Post

    {

    public int PostId { getset; }

    public string Title { getset; }

    public string Content { getset; }

     

    public int BlogId { getset; }

    public Blog Blog { getset; }

    }

    }

     

    using Microsoft.EntityFrameworkCore;

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Threading.Tasks;

     

    namespace PostgreSqlDemo2.Models

    {

    public class BloggingContext : DbContext

    {

    public BloggingContext(DbContextOptions<BloggingContext> options)

    base(options)

    { }

     

    public DbSet<Blog> Blogs { getset; }

    public DbSet<Post> Posts { getset; }

    }

     

    }

  4. 在Startup.cs类中注册DBContext

     

public void ConfigureServices(IServiceCollection services)

{

// Add framework services.

services.AddApplicationInsightsTelemetry(Configuration);

 

services.AddDbContext<BloggingContext>(options =>

options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));

 

services.AddMvc();

}

  1. Appsetting.json中增加连接字符串

    "ConnectionStrings": {

    "DefaultConnection""User ID=test;Password=test;Host=192.168.1.6;Database=testdb;Pooling=true;"

    },

  2. 创建 Migration

    这里要说一下,Migration是ef框架设计的工具,能够用来生成一些框架类。在vs2015中,可以在Nuget控制台中使用Add-Migration,linux或者cmd中,可以使用dotnet ef migration命令,具体请自行学习。

    言归正传,我们开始生成类,在Nuget控制台中输入命令:

    Add-Migration MyFirstMigration

    等待结束,笔者这里会报一个"无法识别的转义序列"的错误,但是不影响使用,笔者已经在apsnet上报了issue。

    然后我们会看到,项目结构中增加了一个文件夹及几个文件如下:

    查看代码:

    using System;

    using System.Collections.Generic;

    using Microsoft.EntityFrameworkCore.Migrations;

     

    namespace PostgreSqlDemo2.Migrations

    {

    public partial class MyFirstMigration : Migration

    {

    protected override void Up(MigrationBuilder migrationBuilder)

    {

    migrationBuilder.CreateTable(

    name: "Blogs",

    columns: table => new

    {

    BlogId = table.Column<int>(nullable: false)

    .Annotation("Npgsql:ValueGeneratedOnAdd"true),

    Url = table.Column<string>(nullable: true)

    },

    constraints: table =>

    {

    table.PrimaryKey("PK_Blogs", x => x.BlogId);

    });

     

    migrationBuilder.CreateTable(

    name: "Posts",

    columns: table => new

    {

    PostId = table.Column<int>(nullable: false)

    .Annotation("Npgsql:ValueGeneratedOnAdd"true),

    BlogId = table.Column<int>(nullable: false),

    Content = table.Column<string>(nullable: true),

    Title = table.Column<string>(nullable: true)

    },

    constraints: table =>

    {

    table.PrimaryKey("PK_Posts", x => x.PostId);

    table.ForeignKey(

    name: "FK_Posts_Blogs_BlogId",

    column: x => x.BlogId,

    principalTable: "Blogs",

    principalColumn: "BlogId",

    onDelete: ReferentialAction.Cascade);

    });

     

    migrationBuilder.CreateIndex(

    name: "IX_Posts_BlogId",

    table: "Posts",

    column: "BlogId");

    }

     

    protected override void Down(MigrationBuilder migrationBuilder)

    {

    migrationBuilder.DropTable(

    name: "Posts");

     

    migrationBuilder.DropTable(

    name: "Blogs");

    }

    }

    }

    Design.cs

    using System;

    using Microsoft.EntityFrameworkCore;

    using Microsoft.EntityFrameworkCore.Infrastructure;

    using Microsoft.EntityFrameworkCore.Metadata;

    using Microsoft.EntityFrameworkCore.Migrations;

    using PostgreSqlDemo2.Models;

     

    namespace PostgreSqlDemo2.Migrations

    {

    [DbContext(typeof(BloggingContext))]

    [Migration("20160713011245_MyFirstMigration")]

    partial class MyFirstMigration

    {

    protected override void BuildTargetModel(ModelBuilder modelBuilder)

    {

    modelBuilder

    .HasAnnotation("ProductVersion""1.0.0-rtm-21431");

     

    modelBuilder.Entity("PostgreSqlDemo2.Models.Blog", b =>

    {

    b.Property<int>("BlogId")

    .ValueGeneratedOnAdd();

     

    b.Property<string>("Url");

     

    b.HasKey("BlogId");

     

    b.ToTable("Blogs");

    });

     

    modelBuilder.Entity("PostgreSqlDemo2.Models.Post", b =>

    {

    b.Property<int>("PostId")

    .ValueGeneratedOnAdd();

     

    b.Property<int>("BlogId");

     

    b.Property<string>("Content");

     

    b.Property<string>("Title");

     

    b.HasKey("PostId");

     

    b.HasIndex("BlogId");

     

    b.ToTable("Posts");

    });

     

    modelBuilder.Entity("PostgreSqlDemo2.Models.Post", b =>

    {

    b.HasOne("PostgreSqlDemo2.Models.Blog""Blog")

    .WithMany("Posts")

    .HasForeignKey("BlogId")

    .OnDelete(DeleteBehavior.Cascade);

    });

    }

    }

    }

     

    using System;

    using Microsoft.EntityFrameworkCore;

    using Microsoft.EntityFrameworkCore.Infrastructure;

    using Microsoft.EntityFrameworkCore.Metadata;

    using Microsoft.EntityFrameworkCore.Migrations;

    using PostgreSqlDemo2.Models;

     

    namespace PostgreSqlDemo2.Migrations

    {

    [DbContext(typeof(BloggingContext))]

    partial class BloggingContextModelSnapshot : ModelSnapshot

    {

    protected override void BuildModel(ModelBuilder modelBuilder)

    {

    modelBuilder

    .HasAnnotation("ProductVersion""1.0.0-rtm-21431");

     

    modelBuilder.Entity("PostgreSqlDemo2.Models.Blog", b =>

    {

    b.Property<int>("BlogId")

    .ValueGeneratedOnAdd();

     

    b.Property<string>("Url");

     

    b.HasKey("BlogId");

     

    b.ToTable("Blogs");

    });

     

    modelBuilder.Entity("PostgreSqlDemo2.Models.Post", b =>

    {

    b.Property<int>("PostId")

    .ValueGeneratedOnAdd();

     

    b.Property<int>("BlogId");

     

    b.Property<string>("Content");

     

    b.Property<string>("Title");

     

    b.HasKey("PostId");

     

    b.HasIndex("BlogId");

     

    b.ToTable("Posts");

    });

     

    modelBuilder.Entity("PostgreSqlDemo2.Models.Post", b =>

    {

    b.HasOne("PostgreSqlDemo2.Models.Blog""Blog")

    .WithMany("Posts")

    .HasForeignKey("BlogId")

    .OnDelete(DeleteBehavior.Cascade);

    });

    }

    }

    }

     

    上面代码都是自动生成的,生成依据就是你的Models中的实体类文件。

     

  3. 创建数据库

    虽然上面生成了数据库架构的代码,但是还没有更新到数据库中去。需要执行:

    Update-Database

    如果显示Done.

    则表示更新数据库成功。可以看看数据库中已经自动根据model实体创建了对应的数据表。

  4. 剩下的工作就和前文一样了,不在细说。

总结:

    记住几个命令 "Add-Migration MyFirstMigration","Update-Database"。注意执行时要保证代码能够正常编译,并且已经完成数据库的配置。如果数据库结构改了,可以修改Models下对应的实体类,然后删除Migration文件夹下的文件,然后从新执行这两个命令。笔者这里使用PostgreSQL的时候,报错了,提示Blogs表已存在,应该是issue,只能自行更新了。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对象关系映射架构(DBFramework)及代码生成器源码 一、使用对象关系映射组件Kenly.DBFramework.dll不用编写任何SQL或者存储过程即可实现下列功能: 1、数据表、视图和存储过程与对象之间的转换。 2、数据表、视图的自定义条件查询。 3、数据表、视图的分页查询。 4、根据ID、主键或自定义条件对数据表进行增、删、改操作。 5、实现一对一、一对多、多对一和多对多的关系映射。 6、支持单个对象和多个对象之间的事务控制。 7、支持查询结果排序。 8、支持查询表达式生成。 9、支持延迟加载。 二、代码生成器 1、根据指定的数据库连接,自动生成数据表、视图和存储过程对应的对象代码(C#代码)。 2、自动生成相关的工程文件,生成完整的业务层项目文件。 3、可以帮助生成自定义查询方法。 4、支持SQLServer2000、SQLServer2005和Oracle代码生成插件,支持插件扩展。 提供 1、对象关系映射组件: Kenly.DBFramework.dll 2、代码生成器源码:CodeHelper。 3、代码生成器插件源码(支持SQLServer2000、SQLServer2005和Oracle):Plugin。 4、使用手册:DBFramework.Manual V4.5.3.pdf。 主要API: public abstract class ViewGateway where T: new() { // Methods static ViewGateway(); protected ViewGateway(); protected static int Count(); protected static int Count(string condition); protected static List CountGroup(string groupBy); protected static List CountGroup(string condition, string groupBy); public static List CreateInstances(int count); protected static List Distinct(string columnName); protected static List Distinct(string columnName, string condition); protected static List Distinct(string columnName, string condition, bool ignoreNull); protected static bool Exists(string condition); public bool ExistsById(); public bool ExistsByPK(); protected static List Find(PagingArg pagingArg, params string[] propertyNames); protected static List Find(string condition, params string[] propertyNames); protected static List Find(PagingArg pagingArg, bool sqlServer2000, params string[] propertyNames); protected static List Find(string condition, PagingArg pagingArg, params string[] propertyNames); protected static List Find(string condition, PagingArg pagingArg, bool sqlServer2000, params string[] propertyNames); protected static List FindAll(params string[] propertyNames); protected static void FindTop(T firstOne); protected static List FindTop(int topCount, params string[] propertyNames); protected static void FindTop(string condition, T firstOne); protected static List FindTop(string condition, int topCount, params string[] propertyNames); protected static void InitializeGateway(GatewayConfig config); protected static void InitializeGateway(DatabaseType dbType, string connectionString); protected void InitializeInstance(T entity); protected static object Max(string columnName); protected static object Max(string columnName, string condition); protected static List MaxGroup(string columnName, string groupBy); protected static List MaxGroup(string columnName, string condition, string groupBy); protected static object Min(string columnName); protected static object Min(string columnName, string condition); protected static List MinGroup(string columnName, string groupBy); protected static List MinGroup(string columnName, string condition, string groupBy); protected static DataTable Query(PagingArg pagingArg, params string[] propertyNames); protected static DataTable Query(string condition, params string[] propertyNames); protected static DataTable Query(PagingArg pagingArg, bool sqlServer2000, params string[] propertyNames); protected static DataTable Query(string condition, PagingArg pagingArg, params string[] propertyNames); protected static DataTable Query(string condition, PagingArg pagingArg, bool sqlServer2000, params string[] propertyNames); protected static DataTable QueryAll(params string[] propertyNames); protected static DataTable QueryTop(int topCount, params string[] propertyNames); protected static DataTable QueryTop(string condition, int topCount, params string[] propertyNames); public ArrayList RetrieveAssociations(); public ArrayList RetrieveAssociations(Type elementType); public ArrayList RetrieveAssociations(params Type[] elementTypes); public void RetrieveById(); public void RetrieveByPK(); protected internal virtual void RetrieveBySql(string sql); public void ShadowCopyTo(object targetEntity); public void ShadowCopyTo(T targetEntity); protected static double Sum(string columnName); protected static double Sum(string columnName, string condition); protected static List SumGroup(string columnName, string groupBy); protected static List SumGroup(string columnName, string condition, string groupBy); public static string ToColumnName(string propertyName); public static T ToObject(DataRow adaptedRow); public static List ToObjects(DataTable adaptedTable); public static List ToObjects(DataRow[] adaptedRows); public static string ToPropertyName(string columnName); public static DataTable ToTable(IList entities); public static DataTable ToTable(params T[] entities); public static DataTable ToTable(bool isAdapted, params T[] entities); public static DataTable ToTable(bool isAdapted, IList entities); // Properties protected internal static string CommandText { get; } protected internal static GatewayConfig Config { get; } internal T Entity { get; set; } public object EntityId { get; } public object PrimaryKey { get; } protected static Order SortedOrder { get; set; } } public abstract class TableGateway : ViewGateway where T: TableGateway, new() { // Methods static TableGateway(); protected TableGateway(); public int AddNew(); public static int AddNew(IList entities); public static int AddNew(T entity); public int AddNew(bool returnIdentity); public static int AddNew(T entity, bool returnIdentity); public static int AddNew(IList entities, out Transaction transaction); public static int AddNew(IList entities, bool returnIdentity); public static int AddNew(T entity, out Transaction transaction); public static int AddNew(IList entities, bool returnIdentity, out Transaction transaction); public static int AddNew(T entity, bool returnIdentity, out Transaction transaction); public IDbTransaction BeginTransaction(); public IDbTransaction BeginTransaction(IsolationLevel isolationLevel); public IDbTransaction BeginTransaction(double activeTime); public IDbTransaction BeginTransaction(IsolationLevel isolationLevel, double activeTime); public bool Commit(); protected static int Delete(string condition); protected static int Delete(string condition, out Transaction transaction); public int DeleteById(); public static int DeleteById(T entity); public static int DeleteById(IList entities); public static int DeleteById(IList entities, out Transaction transaction); public static int DeleteById(T entity, out Transaction transaction); public int DeleteByPK(); public static int DeleteByPK(T entity); public static int DeleteByPK(IList entities); public static int DeleteByPK(IList entities, out Transaction transaction); public static int DeleteByPK(T entity, out Transaction transaction); protected void OnPropertyChanged(MethodBase propertyMethod); protected void OnPropertyChanged(string propertyName); protected internal override void RetrieveBySql(string sql); public bool Rollback(); protected static int Update(T entity, string condition); protected static int Update(T entity, string condition, out Transaction transaction); public int UpdateById(); public static int UpdateById(IList entities); public static int UpdateById(T entity); public static int UpdateById(T entity, out Transaction transaction); public static int UpdateById(IList entities, out Transaction transaction); public int UpdateByPK(); public static int UpdateByPK(IList entities); public static int UpdateByPK(T entity); public static int UpdateByPK(IList entities, out Transaction transaction); public static int UpdateByPK(T entity, out Transaction transaction); // Properties public bool Changed { get; } public List ChangedPropertyNames { get; } } public class StoredProcedure : IStoredProcedure { public bool BeginTransaction(); public void CloseReader(IDataReader reader); public bool Commit(); public DataSet ExecuteDataSet(); public DataTable ExecuteDataTable(); public DataTable ExecuteDataTable(); public List ExecuteEntity(); public int ExecuteNonQuery(); public IDataReader ExecuteReader(); public object ExecuteScalar(); protected static void InitializeGateway(GatewayConfig config); protected static void InitializeGateway(DatabaseType dbType, string connectionString); protected void InitializeInstance(T entity); public bool Rollback(); } public class AggregateEntity where T: AggregateEntity, new() { public static List Execute(); protected static List Execute(string condition); public static DataTable ExecuteDataTable(); protected static DataTable ExecuteDataTable(string condition); protected static void InitializeGateway(GatewayConfig config); protected static void InitializeGateway(DatabaseType dbType, string connectionString); // Properties protected static Order SortedOrder { get; set; } } public static class EntityMapper { // Methods public static void AdaptToDatabase(DataTable adaptedTable); public static void AdaptToEntity(DataTable rawTable); public static void CopyToEntities(IList entities, IList adaptedRows); public static void CopyToEntities(IList entities, DataTable adaptedTable); public static void CopyToEntity(T entity, DataRow row); public static List CreateEntities(int count); public static DataTable CreateTable(); public static DataTable CreateTable(bool isAdapted); public static string ToColumnName(string propertyName); public static List ToEntities(IList adaptedRows); public static List ToEntities(DataTable table); public static T ToEntity(DataRow adaptedRow); public static string ToPropertyName(string columnName); public static DataTable ToTable(IList entities); public static DataTable ToTable(params T[] entities); public static DataTable ToTable(bool isAdapted, params T[] entities); public static DataTable ToTable(bool isAdapted, IList entities); } public static class EntityUtility { // Methods public static List Inherit(IList entities); public static T Inherit(object entity); public static T Inherit(Tbase baseEntity, TransformAction method); public static List Inherit(IList baseEntities, TransformAction method); public static void ShadowCopy(IList targetEntities, IList sourceEntities); public static void ShadowCopy(object targetEntity, object sourceEntity); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值