博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityFramework系列:SQLite.CodeFirst自动生成数据库
阅读量:6291 次
发布时间:2019-06-22

本文共 5185 字,大约阅读时间需要 17 分钟。

http://www.cnblogs.com/easygame/p/4447457.html

在Code First模式下使用SQLite一直存在不能自动生成数据库的问题,使用SQL Server Compact再转换到SQLite的方式(SQL Server Compact/SQLite Toolbox插件)基本不在我的考虑范围内,直接使用SQL Server Compact性能又是问题。理论上我们可以自己去实现SQLite的Code Frist支持,但实际上我只是在等待它的出现。期待了一年多,真的出现了。

1.首先定义实体:

Customer、Role、Category、Post。

public class BaseEntity    {        public int Id { get; set; }    }    public class Customer : BaseEntity    {        public Customer()        {            this.Roles = new List
(); } public string UserName { get; set; } public virtual ICollection
Roles { get; set; } } public class Role : BaseEntity { public Role() { this.Customers = new List
(); } public virtual ICollection
Customers { get; set; } public string RoleName { get; set; } } public class Category : BaseEntity { public Category() { this.Children = new List
(); this.Posts = new List
(); } public int? ParentId { get; set; } public virtual Category Parent { get; set; } public virtual ICollection
Children { get; set; } public virtual ICollection
Posts { get; set; } } public class Post : BaseEntity { public virtual Category Category { get; set; } }

 

2.定义实体映射

CustomerMap、RoleMap、CategoryMap和PostMap作为关系表、索引的配置。

public class CustomerMap : EntityTypeConfiguration
{ public CustomerMap() { this.Property(o => o.UserName).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = true })); } } public class RolerMap : EntityTypeConfiguration
{ public RolerMap() { this.HasMany(o => o.Customers).WithMany(o => o.Roles); } } public class CategoryMap : EntityTypeConfiguration
{ public CategoryMap() { this.HasOptional(o => o.Parent).WithMany(o => o.Children).HasForeignKey(o => o.ParentId); } } public class PostMap : EntityTypeConfiguration
{ public PostMap() { this.HasOptional(o => o.Category).WithMany(o => o.Posts); } }

 

3.定义初始化数据:

目前SQLite.CodeFist只支持DropCreateDatabaseAlways和CreateDatabaseIfNotExists方式。

public class MyDbInitializer : SqliteDropCreateDatabaseAlways
{ public MyDbInitializer(string connectionString, DbModelBuilder modelBuilder) : base(connectionString, modelBuilder) { } protected override void Seed(SqliteDbContext context) { context.Set
().Add(new Customer { UserName = "user" + DateTime.Now.Ticks.ToString(), Roles = new List
{ new Role { RoleName = "user" } } }); context.Set
().Add(new Post { Category = new Category() }); base.Seed(context); } }

 

4.定义DbContext:

此处必须配置PluralizingTableNameConvention,否则无法正常使用。

public class SqliteDbContext : DbContext    {        public SqliteDbContext()            : base("DefaultConnection")        {        }        protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            modelBuilder.Conventions.Remove
(); modelBuilder.Configurations.AddFromAssembly(typeof(SqliteDbContext).Assembly);#if DEBUG Database.SetInitializer(new MyDbInitializer(Database.Connection.ConnectionString, modelBuilder));#endif } }

 

5.配置Web.config:

默认的配置文件各种问题。可以直接拷贝项目中的测试用的配置文件。

 

6.配置Global.asax:

public class MvcApplication : System.Web.HttpApplication    {        protected void Application_Start()        {            using (var db = new SqliteDbContext())            {            }            AreaRegistration.RegisterAllAreas();            RouteConfig.RegisterRoutes(RouteTable.Routes);        }    }

 

查看生成的数据库:表映射、关系映射和索引都正确创建了。

调用一下:

代码已经上传到gitosc:

你可能感兴趣的文章
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>