先决条件
1、安装Visual Studio 2012 或Visual Studio 2013
2、安装Entity Framework Tools for Visual Studio 6.1或更高版本。安装EF参考Get Entity Framework。
一、准备一个数据库
本文中数据库名为Blogging。
二、创建一个应用程序
本文为了操作简单起见,创建了一个使用Code First方式访问数据的控制台应用程序。控制台应用程序名为:CodeFirstExistingDatabaseSample。
三、逆向工程模型
我们将会使用Entity Framework Tools for Visual Studio来帮助我们生成与数据库相匹配的初始代码。这个工具只是用来生成代码,当然也可以手工写这些代码。步骤如下:
1、项目->添加新项
2、选择“数据”,然后,选择“ADO.NET实体数据模型”
3、名称输入BloggingContext,点击确定
4、启动“实体数据模型向导”
5、选择“从数据库生成”,点击下一步,如图。
6、选择你已经创建好的数据库连接,点击下一步
7、选择表,点击完成
逆向工程模型完成后一些项会被添加到项目中,让我们看一下会添加哪些项。
四、逆向工程模型添加的项
1、配置文件
一个App.config文件已经被添加到项目中,这个文件包含了连接到现有数据库的连接字符串。
<connectionStrings>
<add
name="BloggingContext"
connectionString="data source=(localdb)\v11.0;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
你也会看到配置文件中其他的设置,这些设置是Code First模式下创建数据库时EF的默认设置。因为我们是要映射到一个现有的数据库所以这些设置在应用程序中将会被忽略。
2、派生的Context
一个BloggingContext类已经被添加到项目中。Context代表了与数据库的会话,使数据库允许我们进行查询和保存数据。
在我们的model中,数据库上下文为每一个类型都公开了一个DbSet<TEntity>。你也会注意到类中默认的构造函数使用“name=”语法调用了一个base构造函数,这会告诉Code First连接字符串使用配置文件中的连接字符串。
public partial class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingContext")
{
}
public virtual DbSet<Blog> Blogs { get; set; }
public virtual DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
当你使用配置文件中的连接字符串时,你必须使用“name=”这种方式。这样做确保了如果连接字符串不存在EF会抛出错误而不是按照约定创建一个新的数据库。
3、model类
最后,Blog和Post类也会被添加到项目中。这些类都是域类并构成了model。这些类的数据注释可以重新指定Code First与现有数据库结构不匹配的约定。例如,Blog.Name 和 Blog.Url属性有StringLength注释,因为在数据库中这两个字段的最大长度是200(Code First默认的最大长度是被数据库能够支持的最大长度,在SQL Server中是nvarchar(max))。
public partial class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public int BlogId { get; set; }
[StringLength(200)]
public string Name { get; set; }
[StringLength(200)]
public string Url { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
五、读写数据
现在使用model访问数据。通过执行Program.cs中的Main方法来显示执行结果。这段代码创建一个新实例的上下文,然后使用它来插入一个新的博客。然后它使用LINQ查询从数据库中按标题的字母顺序检索所有博客。
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
现在运行应用程序进行测试。结果如下:
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...
其他问题
1、自定义生成代码
更多信息请参阅:Customizing Code First to an Existing Database
2、数据库发生改变,如何修改model
Code First生成的类可以调整和修改。如果数据库发生了改变,你可以手工编辑类或者再次执行逆向工程重写类。
3、对现有数据库使用Code First迁移