CodeFirst New Database 使用Migration 和Fluent API
2012-12-31 12:50
302 查看
先决条件:
安装了VS2010或者VS2012.
如果使用VS2010,则需要手动安装NuGet.
1、创建应用程序
创建一个控制台应用程序,命名为:CodeFirstNewDatabaseSample
2、创建实体类
3、创建上下文
上下文代表和数据库之间的会话,创建一个继承System.Data.Entity.DbContext 的类 并且为实体类添加DbSet<TEntity>属性。
使用NuGet添加Entity Framework支持。
工程--管理NuGet程序包,添加最新的EntityFramework支持。
选择联机
选择EntityFramework包
点击安装
在Program的顶部添加using System.Data.Entity;
4 创建和读取数据
运行程序会看到下图
数据放在那里?
使用LocalDb查看数据(LocalDb在安装VS2012时已经安装)
视图--Sql Server对象资源管理器
图中已可以看到新建的数据库BlogContext
5、处理实体类更改
在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令。
工具--库程序包管理器--程序包管理器控制台
运行命令:Enable-Migrations 启用Code first Migration
运行成功后会产生两个类:Configuration.cs 和[b]<timestamp>_InitialCreate.cs,[/b]这是一个用时间戳作为前缀的类。如201212310201487_InitialCreate.cs
然后更改实体类Blog,增加一个属性Url
运行命令:Add-Migration AddUrl,运行成功后会产生一个类:201212310209000_AddUrl.cs
运行命令:Update-Database,该命令运行成功后,更改属性将会映射到数据库。在SQL Server资源管理中刷新数据库查看变更。
6:Data Annotations
到目前为止我们使用EF发现实体类都是使用默认的行为,有很多行为不符合我们的要求,所以我们使用Data Annotations和 fluent API解决这个问题。
先添加一个User类,然后更新BlogContext:
如果当前我们使用migration命令去变更数据库,则会提示错误:“EntityType ‘User’ has no key defined. Define the key for this EntityType”,因为EF没有办法知道Username应该是User表的主键,在Program顶部添加代码:using System.ComponentModel.DataAnnotations; 然后给Username属性添加属性Key
运行命令:Add-Migration AddUser将变更映射到数据库。运行成功后会产生一个类:201212310235372_AddUser.cs
运行命令:Update-Database将新的迁移映射到数据库,此时查看数据库会产生User表。
7、Fluent API
如果我们需要更变列名,则使用FluentAPI, 如果我们需要把User表的DisplayName改为Display_name.在BlogContext中重写OnModelCreating:
运行命令:Add-Migration ChangeDisplayName.
运行命令:Update-Database.
查看User表已更新字段Display_name.
安装了VS2010或者VS2012.
如果使用VS2010,则需要手动安装NuGet.
1、创建应用程序
创建一个控制台应用程序,命名为:CodeFirstNewDatabaseSample
2、创建实体类
public class Blog { public int BlogId { get; set; } public String Name { get; set; } public virtual List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public String Title { get; set; } public String Content { get; set; } public int BlogId { get; set; } public virtual Blog Blog { get; set; } }
3、创建上下文
上下文代表和数据库之间的会话,创建一个继承System.Data.Entity.DbContext 的类 并且为实体类添加DbSet<TEntity>属性。
使用NuGet添加Entity Framework支持。
工程--管理NuGet程序包,添加最新的EntityFramework支持。
选择联机
选择EntityFramework包
点击安装
在Program的顶部添加using System.Data.Entity;
public class BlogContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } }
4 创建和读取数据
static void Main(string[] args) { using (var db = new BlogContext()) { Console.Write("Enter a blog name:"); var name = Console.ReadLine(); var blog = new Blog { Name = name }; db.Blogs.Add(blog); db.SaveChanges(); Console.WriteLine("All blogs in database..."); var query = from b in db.Blogs orderby b.Name select b; foreach (var b in query) { Console.WriteLine(b.Name); } Console.WriteLine("Press any key to exit"); Console.ReadKey(); } }
运行程序会看到下图
数据放在那里?
使用LocalDb查看数据(LocalDb在安装VS2012时已经安装)
视图--Sql Server对象资源管理器
图中已可以看到新建的数据库BlogContext
5、处理实体类更改
在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令。
工具--库程序包管理器--程序包管理器控制台
运行命令:Enable-Migrations 启用Code first Migration
运行成功后会产生两个类:Configuration.cs 和[b]<timestamp>_InitialCreate.cs,[/b]这是一个用时间戳作为前缀的类。如201212310201487_InitialCreate.cs
然后更改实体类Blog,增加一个属性Url
public class Blog { public int BlogId { get; set; } public String Name { get; set; } public String Url { get; set; } public virtual List<Post> Posts { get; set; } }
运行命令:Add-Migration AddUrl,运行成功后会产生一个类:201212310209000_AddUrl.cs
运行命令:Update-Database,该命令运行成功后,更改属性将会映射到数据库。在SQL Server资源管理中刷新数据库查看变更。
6:Data Annotations
到目前为止我们使用EF发现实体类都是使用默认的行为,有很多行为不符合我们的要求,所以我们使用Data Annotations和 fluent API解决这个问题。
先添加一个User类,然后更新BlogContext:
public class User { public String Username { get; set; } public String DisplayName { get; set; } }
如果当前我们使用migration命令去变更数据库,则会提示错误:“EntityType ‘User’ has no key defined. Define the key for this EntityType”,因为EF没有办法知道Username应该是User表的主键,在Program顶部添加代码:using System.ComponentModel.DataAnnotations; 然后给Username属性添加属性Key
public class User { [Key] public String Username { get; set; } public String DisplayName { get; set; } }
运行命令:Add-Migration AddUser将变更映射到数据库。运行成功后会产生一个类:201212310235372_AddUser.cs
public partial class AddUser : DbMigration { public override void Up() { CreateTable( "dbo.Users", c => new { Username = c.String(nullable: false, maxLength: 128), DisplayName = c.String(), }) .PrimaryKey(t => t.Username); } public override void Down() { DropTable("dbo.Users"); } }
运行命令:Update-Database将新的迁移映射到数据库,此时查看数据库会产生User表。
7、Fluent API
如果我们需要更变列名,则使用FluentAPI, 如果我们需要把User表的DisplayName改为Display_name.在BlogContext中重写OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<User>() .Property(u=>u.DisplayName) .HasColumnName("Display_name"); }
运行命令:Add-Migration ChangeDisplayName.
运行命令:Update-Database.
查看User表已更新字段Display_name.
相关文章推荐
- 使用Fluent API进行实体映射【Code-First系列】
- EF Code First 使用反射加载程序集中的Fluent API配置文件
- 使用Fluent API进行属性映射【Code-First系列】
- Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
- Code First for Mysql 错误:未为提供程序“MySql.Data.MySqlClient”找到任何 MigrationSqlGenerator。请在目标迁移配置类中使用 SetSql
- 【Code-First系列】 使用Fluent API进行实体映射
- Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
- EF CodeFirst 使用T4模板 生成文件
- Code First 与 DataBase First(.edmx)的区别以及 对于EF对非 ms-sql server数据库的支持
- 关于MVC使用Code-First代码优先来先建实体类中间添加新字段不需要重新建立数据库的方法
- Code First :使用Entity. Framework编程(5)
- MVC学习6 学习使用Code First Migrations功能 把Model的更新同步到DB中
- 【译著】Code First :使用Entity. Framework编程(8)
- 使用EF Code-First方式和Fluent API来探讨EF中的关系
- 使用ef code first模式,在部署后服务器端把数据库同步到最新版本的方法
- Database first with EntityFramework (Migration)安装和升级
- MySQL下使用EF Code First指定表Engine无效时的解决办法
- 解决Entity Framework Code First 的问题——Model compatibility cannot be checked because the database does not contain model metadata
- 【译著】Code First :使用Entity. Framework编程(2)
- ASP.Net MVC极速开发:使用MVCScaffolding + EntityFramework CodeFirst