CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法。

本文采用的示例仍然是前两篇采用的博客用户的示例。故不在此对业务进行描述。

首先新建一个C#控制台应用程序,并命名为EFCodeFirstSample。
利用Nuget为该项目添加引用Entity Framework4.1的引用。
PM> Install-Package EntityFramework
当然,你也可以用常规的方式,先下载EF4.1安装后,在进行添加。
同时代码中引用命名空间
using System.Data.Entity;

第二步:为项目添加2个实体对象,仍然采用前面所描述过的博客用户及随笔类,代码如下示:

    public partial class BlogUser
{
/// <summary>
/// 默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键
/// 如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常
/// </summary>
public int BlogUserId { get; set; }
public string BlogName { get; set; }
/// <summary>
/// 定义博客用户的随笔列表
/// virtual表示该列表为延迟加载
/// </summary>
public virtual ICollection<Post> Posts { get; set; }
} public partial class Post
{
public int PostId { get; set; }
public string PostTitle { get; set; }
public int BlogUserId { get; set; }
/// <summary>
/// 延迟加载博客用户
/// </summary>
public virtual BlogUser BlogUser { get; set; }
}

第三步:定义DbContext

   public class BlogDbContext : DbContext
{ public IDbSet<BlogUser> BlogUsers { get; set; }
public IDbSet<Post> Posts { get; set; } }

第四步:编写测试代码

            using (var db = new BlogDbContext())
{
//向数据库添加记录
var blogUser = new BlogUser() { BlogUserId = 1, BlogName = "燕赤霞" };
db.BlogUsers.Add(blogUser);
var post = new Post() { PostId = 1,
PostTitle = "一切皆有可能--我与小倩不得不说的事",
BlogUserId = 1 };
db.Posts.Add(post); //保存记录,返回受影响的行数
int recordsAffected = db.SaveChanges();
Console.WriteLine("追加{0}记录成功", recordsAffected);
}
好了,写到这里可以运行测试了,运行结果如下:

你可以打开数据库管理器,可以找到
EFCodeFirstSample.BlogDbContext 数据库,他包含BlogUsers表和Posts表,并且建立了主外键关系

完整代码如下:

EFCodeFirstSample.BlogDbContext 数据库,他包含BlogUsers表和Posts表,并且建立了主外键关系

完整代码如下:
完整代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace CodeFirstSample
{
class Program
{
static void Main(string[] args)
{

using (var db = new BlogDbContext())
{
//向数据库添加记录
var blogUser = new BlogUser() { BlogUserId = 1, BlogName = "燕赤霞" };
db.BlogUsers.Add(blogUser);
var post = new Post() { PostId = 1,
PostTitle = "一切皆有可能--我与小倩不得不说的事",
BlogUserId = 1 };
db.Posts.Add(post);

//保存记录,返回受影响的行数
int recordsAffected = db.SaveChanges();
Console.WriteLine("追加{0}记录成功", recordsAffected);
}
}
}

public partial class BlogUser
{
/// <summary>
/// 默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键
/// 如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常
/// </summary>
public int BlogUserId { get; set; }
public string BlogName { get; set; }
/// <summary>
/// 定义博客用户的随笔列表
/// virtual表示该列表为延迟加载
/// </summary>
public virtual ICollection<Post> Posts { get; set; }
}

public partial class Post
{
public int PostId { get; set; }
public string PostTitle { get; set; }
public int BlogUserId { get; set; }
/// <summary>
/// 延迟加载博客用户
/// </summary>
public virtual BlogUser BlogUser { get; set; }
}

public class BlogDbContext : DbContext
{
public IDbSet<BlogUser> BlogUsers { get; set; }
public IDbSet<Post> Posts { get; set; }

}

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations; namespace CodeFirstSample
{
class Program
{
static void Main(string[] args)
{ using (var db = new BlogDbContext())
{
//向数据库添加记录
var blogUser = new BlogUser() { BlogUserId = 1, BlogName = "燕赤霞" };
db.BlogUsers.Add(blogUser);
var post = new Post() { PostId = 1,
PostTitle = "一切皆有可能--我与小倩不得不说的事",
BlogUserId = 1 };
db.Posts.Add(post); //保存记录,返回受影响的行数
int recordsAffected = db.SaveChanges();
Console.WriteLine("追加{0}记录成功", recordsAffected);
}
}
} public partial class BlogUser
{
/// <summary>
/// 默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键
/// 如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常
/// </summary>
public int BlogUserId { get; set; }
public string BlogName { get; set; }
/// <summary>
/// 定义博客用户的随笔列表
/// virtual表示该列表为延迟加载
/// </summary>
public virtual ICollection<Post> Posts { get; set; }
} public partial class Post
{
public int PostId { get; set; }
public string PostTitle { get; set; }
public int BlogUserId { get; set; }
/// <summary>
/// 延迟加载博客用户
/// </summary>
public virtual BlogUser BlogUser { get; set; }
} public class BlogDbContext : DbContext
{
public IDbSet<BlogUser> BlogUsers { get; set; }
public IDbSet<Post> Posts { get; set; } } }

EFCodeFirstSample.BlogDbContext 数据库,他包含BlogUsers表和Posts表,并且建立了主外键关系

完整代码如下:
完整代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace CodeFirstSample
{
class Program
{
static void Main(string[] args)
{

using (var db = new BlogDbContext())
{
//向数据库添加记录
var blogUser = new BlogUser() { BlogUserId = 1, BlogName = "燕赤霞" };
db.BlogUsers.Add(blogUser);
var post = new Post() { PostId = 1,
PostTitle = "一切皆有可能--我与小倩不得不说的事",
BlogUserId = 1 };
db.Posts.Add(post);

//保存记录,返回受影响的行数
int recordsAffected = db.SaveChanges();
Console.WriteLine("追加{0}记录成功", recordsAffected);
}
}
}

public partial class BlogUser
{
/// <summary>
/// 默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键
/// 如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常
/// </summary>
public int BlogUserId { get; set; }
public string BlogName { get; set; }
/// <summary>
/// 定义博客用户的随笔列表
/// virtual表示该列表为延迟加载
/// </summary>
public virtual ICollection<Post> Posts { get; set; }
}

public partial class Post
{
public int PostId { get; set; }
public string PostTitle { get; set; }
public int BlogUserId { get; set; }
/// <summary>
/// 延迟加载博客用户
/// </summary>
public virtual BlogUser BlogUser { get; set; }
}

public class BlogDbContext : DbContext
{
public IDbSet<BlogUser> BlogUsers { get; set; }
public IDbSet<Post> Posts { get; set; }

}

}

EF框架step by step(3)—Code-First的更多相关文章

  1. EF框架step by step(7)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  2. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

  3. EF框架step by step(8)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  4. EF框架step by step(6)—处理实体complex属性

    上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...

  5. EF框架step by step(5)—处理实体简单属性

    EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录.当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值. 先通过简单的代 ...

  6. EF框架step by step(2)—Model-First

    这一篇主要说一下EF框架中,Model First做法,仍然采用上一篇的案例.但增加评论功能.首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示: 点击确定,关闭窗口. ...

  7. WPF Step By Step 系列-Prism框架在项目中使用

    WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...

  8. Code Understanding Step by Step - We Need a Task

      Code understanding is a task we are always doing, though we are not even aware that we're doing it ...

  9. enode框架step by step之消息队列的设计思路

    enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...

随机推荐

  1. FragmentHelper

    package com.icitymobile.anda.util; import java.lang.ref.SoftReference; import java.util.ArrayList; i ...

  2. ManageEngine Glossary

    https://www.manageengine.com/products/applications_manager/help/glossary-applications-manager.html#s ...

  3. BlueTooth: 蓝牙基础知识进阶——链路控制操作

    转自:http://blog.csdn.net/augusdi/article/details/25887395 七链路控制操作 链路控制操作就是用来描述一个设备是如何加入piconet又是如何从一个 ...

  4. 【JAVA正则表达式综合练习】

    一.治疗口吃. 将字符串“我我我我我我我..........我.......要要要要要..................要要要要...学习习习习.......习习习习习习习习编程程程程程程..... ...

  5. WPF 多语言实现

    很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件.这篇博客中将介绍在WPF中实现多语言的方式. 方式一,使用WPF动态资源的方式实现.先简单介绍下StaticResour ...

  6. 在WPF中使用CefSharp嵌入浏览器

    日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它是基于Google浏览器的一个组件,我们可以在 ...

  7. 第十四篇:在SOUI中使用定时器

    前言 定时器是win32编程中常用的制作动画效果的手段.在Win32编程中,可以使用::SetTimer来创建定时器,定时器消息会被会发到调用SetTimer时指定的HWND. 在SOUI中一般来说只 ...

  8. MarkupExtension

    —目的 如果要在XAML里引用静态或动态对象实例,或在XAML中创建带有参数的类.这时,我们需要用到XAML扩展.XAML扩展常用来设定属性值.使用标识扩展,告诉 XAML 处理不要像通常那样将属性值 ...

  9. linux下SVN忽略文件/文件夹的方法

    linux下SVN忽略文件/文件夹的方法 假设想忽略文件temp 1. cd到temp所在的目录下: 2. svn propedit svn:ignore . 注意:请别漏掉最后的点(.表示当前目录) ...

  10. 用js实现图片自动加载的瀑布流效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...