EF中创建CodeFirst模式

2018-07-06  本文已影响0人  没伞的小孩

一,什么事Code First

EF4.1中开始支持Code First 。这种方式在领域设计模式中非常有用。使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合,而不是首先来设计数据库,然后来根据数据库设计你的类,Code-First APis将会基于你的类和配置,为你创建数据库。

工作流是:
首先写好领域类和上下文类--->为领域类额外配置映射条件----->点击F5运行程序---->Code--First APIs创建新的数据库,或者将领域类和已经存在的数据库进行映射---->设置添加测试的数据到数据库中---->最后运行程序。

namespace Models
{
    using System;
    using System.Collections.Generic;
    using System.Web.Script.Serialization;
    
    /// <summary>
    /// 图书
    /// </summary>
    public partial class Books
    {
        public Books()
        {
            this.OrderBooks = new HashSet<OrderBook>();
            this.TemporaryCarts = new HashSet<TemporaryCart>();
        }
    
        /// <summary>
        /// 图书Id
        /// </summary>
        public int Id { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 作者
        /// </summary>
        public string Author { get; set; }
        /// <summary>
        /// 出版社Id
        /// </summary>
        public int PublisherId { get; set; }
        /// <summary>
        /// 出版日期
        /// </summary>
        public System.DateTime PublishDate { get; set; }
        /// <summary>
        /// 条形码 
        /// </summary>
        public string ISBN { get; set; }
        /// <summary>
        /// 价格
        /// </summary>
        public decimal UnitPrice { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string ContentDescription { get; set; }
        /// <summary>
        /// 简介
        /// </summary>
        public string TOC { get; set; }
        /// <summary>
        /// 图书分类Id
        /// </summary>
        public int CategoryId { get; set; }
        /// <summary>
        /// 购买次数
        /// </summary>
        public int Clicks { get; set; }
    
        /// <summary>
        /// 图书分类
        /// </summary>
        public virtual Category Category { get; set; }
        /// <summary>
        /// 出版社
        /// </summary>
        public virtual Publisher Publisher { get; set; }

        /// <summary>
        /// 图书订单集合
        /// </summary>
        [ScriptIgnore]
        public virtual ICollection<OrderBook> OrderBooks { get; set; }
        /// <summary>
        /// 购物车集合
        /// </summary>
        [ScriptIgnore]
        public virtual ICollection<TemporaryCart> TemporaryCarts { get; set; }
    }
}
【注意上面这样写实体是对应数据库表、字段一字不差的对应着写的,如果属性名和数据库上字段名称不一致要通过特性控制,主键,表的名称。】因为EF6在映射的时候属性名为Id,会默认为主键,否则加key是显示指定,例如:
/// <summary>
    /// 图书
    /// </summary>
    [Table("Books")]
    public partial class Books
    {
        public Books()
        {
            this.OrderBooks = new HashSet<OrderBook>();
            this.TemporaryCarts = new HashSet<TemporaryCart>();
        }
    
        /// <summary>
        /// 图书Id  主键
        /// </summary> 
       [Key]
        public int Id { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 作者
        /// </summary>
        public string Author { get; set; }
        /// <summary>
        /// 出版社Id
        /// </summary>
        public int PublisherId { get; set; }
        /// <summary>
        /// 出版日期
        /// </summary>
        public System.DateTime PublishDate { get; set; }
        /// <summary>
        /// 条形码 
        /// </summary>
        public string ISBN { get; set; }
        /// <summary>
        /// 价格
        /// </summary>
        public decimal UnitPrice { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string ContentDescription { get; set; }
        /// <summary>
        /// 简介
        /// </summary>
        public string TOC { get; set; }
        /// <summary>
        /// 图书分类Id
        /// </summary>
        public int CategoryId { get; set; }
        /// <summary>
        /// 购买次数
        /// </summary>
        public int Clicks { get; set; }
    
        /// <summary>
        /// 图书分类
        /// </summary>
        public virtual Category Category { get; set; }
        /// <summary>
        /// 出版社
        /// </summary>
        public virtual Publisher Publisher { get; set; }

        /// <summary>
        /// 图书订单集合
        /// </summary>
        [ScriptIgnore]
        public virtual ICollection<OrderBook> OrderBooks { get; set; }
        /// <summary>
        /// 购物车集合
        /// </summary>
        [ScriptIgnore]
        public virtual ICollection<TemporaryCart> TemporaryCarts { get; set; }
    }

3.数据库对应的实体都写完后,开始写上下文操作类

namespace Models.db_set
{
    /// <summary>
    /// 数据操作上下文
    /// </summary>
    public class db_context:DbContext
    {

        //构造函数
        public db_context():base("strConn")
        {
                
        }

        public DbSet<Books> Books { get; set; }  //图书对象池
        public DbSet<Category> Category { get; set; } //图书分类对象池
        public DbSet<Order> Order { get; set; } //订单对象池
        public DbSet<OrderBook> OrderBook { get; set; }  //图书订单对象池
        public DbSet<Publisher> Publisher { get; set; } //出版社对象池
        public DbSet<TemporaryCart> TemporaryCart { get; set; } //购物车对象池
        public DbSet<User> User { get; set; }   //用户对象池
        public DbSet<UserRole> UserRole { get; set; }   //用户角色对象池
        public DbSet<UserState> UserState { get; set; }  //用户状态

    }
}

4.上下文类写好后,最后放置个配置文件用于连接数据库:
在Web.config中<configuration></configuration>节点下写:

  <connectionStrings>
    <add name="strConn" providerName="System.Data.SqlClient" connectionString="server=.;uid=accp;pwd=ok;database=BookShopPlus2"/>
  </connectionStrings>

这样EF Code Frist就算是搭建好了:

5.在web显示层调用,或者在三层中使用,在var db = new db_context();时,你会发现
var list = db.Books.ToList(); 这个ToList();方法没有 ,点不出来,为什么,因为没有这个方法啊,说明引用没加,在当前这个类库中添加引用浏览当前项目中的\packages\EntityFramework.6.2.0\lib\net40 目录下添加EntityFramework.dll 和 EntityFramework.SqlServer.dll两个库文件
在点的时候方法就能点出来了。这个时候就可以调用了随便搓搓了;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Models;

namespace UI.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            var db = new Models.db_set.db_context();
            var list = db.Books.AsNoTracking().ToList();
            return View(list);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读