先决条件:
安装了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 和<timestamp>_InitialCreate.cs,这是一个用时间戳作为前缀的类。如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.
© 2022-2023 Fengnayun.com 版权所有 | 沪ICP备2022019637号-1 | 51LA统计
增值电信业务经营许可证:B1-20223846 | 黔作登字-2022-F-00488892
代理域名注册服务机构:成都西维数码科技有限公司 | 部分地域产品合作单位:云南悍铭科技有限公司