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. Stanford大学机器学习公开课(二):监督学习应用与梯度下降

    本课内容: 1.线性回归 2.梯度下降 3.正规方程组   监督学习:告诉算法每个样本的正确答案,学习后的算法对新的输入也能输入正确的答案   1.线性回归 问题引入:假设有一房屋销售的数据如下: 引 ...

  2. string int 转换

    int转stringint n = 0;std::stringstream ss;std::string str;ss<<n;ss>>str;string转intstd::st ...

  3. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  4. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper

    前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ...

  5. JavaWeb学习之Path总结、ServletContext、ServletResponse、ServletRequest(3)

    1.Path总结 1.java项目 1 File file = new File(""); file.getAbsolutePath(); * 使用java命令,输出路径是,当前j ...

  6. QQ互联OAuth

    /** * QQ互联 oauth * @author dyllen * */ class Oauth { //取Authorization Code Url const PC_CODE_URL = ' ...

  7. 无法启动程序 ”*.lib”

    解决办法: 把含有入口函数(main函数)的 工程 如 cpp-test 设置为启动项 具体操作: 选中 cpp-test 工程 右击 —> 设为启动项目

  8. C语言里面捕获错误机制

    在C语言中异常处理一般有这么几种方式: 1.使用标准C库提供了abort()和exit()两个函数,它们可以强行终止程序的运行,其声明处于<stdlib.h>头文件中. 2.使用asser ...

  9. C++异常处理机制几种方法

    一.异常 迄今为止,我们处理程序中的错误一般都是用if语句测试某个表达式,然后处理错误的特定义代码. C++异常机制使用了三个新的关键字  (SEH(结构化异常处理)) try    ──标识可能出现 ...

  10. sublime text 2中Emmet8个常用的技巧

    原文链接:http://blog.csdn.net/lmmilove/article/details/9181323 因为开始做web项目,所以最近在用sublime编辑器,知道了一个传说中的emme ...