• EF学习和使用(三)Code First


    Code First模式我们称之为“代码优先”模式。从某种角度来看。其实“Code First”和“Model First”区别并非太明显。仅仅是它不借助于实体数据模型设计器。而是直接通过编码方式设计实体模型(这也是为什么最開始“Code First”被叫做“Code Only”的原因)。

    可是对于EF它的处理过程有所区别,比如我们使用Code First就不再须要EDM文件,全部的映射通过“数据凝视”和“fluent API”进行映射和配置。



    另外须要注意的是“Code First”并不表示一定就要手动编写实体类。其实假设有数据库的话能够取巧,通过现有数据库直接生成实体类。


    Code First怎样使用


    首先

    创建一个控制台应用程序。接下来加入两个类“Order”和“OrderDetail”。须要注意的是这两个类有两个导航属性“Order.OrderDetails”和“OrderDetail.Order”:

    using System;
    using System.Collections.Generic;
    namespace CodeFirst
    {
        public class Order
        {
            public int Id { get; set; }
            public string Customer { get; set; }
            public System.DateTime OrderDate { get; set; }
    
            public virtual List<OrderDetail> OrderDetails { get; set; }
        }
    }
    
    using System;
    using System.Collections.Generic;
    namespace CodeFirst
    {
        public partial class OrderDetail
        {
            public int Id { get; set; }
            public string Product { get; set; }
            public string UnitPrice { get; set; }
            public int OrderId { get; set; }
    
            public virtual Order Order { get; set; }
        }
    }
    

    其次

    有了这两个类之后还须要定义一个数据库上下文,来进行数据操作,这个类必须继承于”System.Data.Entity.DbContext”类。因此接下来我们须要引入EntityFramework包,可通过NuGet进行在线安装。

    数据库上下文操作类:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Entity;
    namespace CodeFirst
    {
        public class OrderContext : DbContext
        {
            public DbSet<Order> Orders { get; set; }
            public DbSet<OrderDetail> OrderDetails { get; set; }
        }
    
    }

    測试

    然后我们进行測试,在这个类中我们首先创建了一个Order实例,接着编码查询:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace CodeFirst
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var ctx = new OrderContext())
                {
    var o = new Order();
                    o.OrderDate = DateTime.Now;
                    ctx.Orders.Add(o);
                    ctx.SaveChanges();
    var query = from order in ctx.Orders
                                select order;
                    foreach (var q in query)
                    {
                        Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate);
                    }
    Console.Read();
                }
            }
        }
    }
    


    查询结果如图:

    这里写图片描写叙述



    哎等等好像哪里不正确!

    咱们明明没有进行不论什么数据库的配置,没有说明往哪个数据库加入。也没有设置连接字符串。可是添加了一条数据,通过查询发现确实保存上了,那么我们的数据究竟在哪呢?其实假设用户不进行数据库配置EF默认会使用“.SQLEXPRESS”数据库实例,假设你没有安装“.SQLEXPRESS”则默认使用LocalDb。关于LocalDb的详细细节请看:SQL Server 2012 Express LocalDB,通常会存放在文件夹:“C:Usersusername”,能够看到创建了一个名为“CodeFirst.OrderContext”的数据库:

    这里写图片描写叙述




    可是正常情况下我们是须要自己控制建立数据库的,比如我想让他保存在某台server上。而且数据库的名字是“CodeFirstDb”,此时我们就须要在配置文件App.Config中配置一个数据库连接串,然后在我们的数据库上下文中指定这个连接名称。


    在配置文件里加入:

      <connectionStrings>
        <add name="CodeFirstDb" connectionString="Data Source=.;Database=CodeFirstDb;UID=sa;PWD=123456;" providerName="System.Data.SqlClient"></add>
      </connectionStrings>


    改动OrderContext类:

    构造函数多了一个连接名參数:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Entity;
    namespace CodeFirst
    {
    
        public class OrderContext : DbContext
        {
            public OrderContext(string connectionName)
                : base(connectionName) { }
    
            public DbSet<Order> Orders { get; set; }
            public DbSet<OrderDetail> OrderDetails { get; set; }
        }
    }
    

    client使用:

    传入配置的数据库连接字符串名称:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace CodeFirst
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var ctx = new OrderContext("CodeFirstDb"))
                {
    var o = new Order();
                    o.OrderDate = DateTime.Now;
                    ctx.Orders.Add(o);
                    ctx.SaveChanges();
    var query = from order in ctx.Orders
                                select order;
                    foreach (var q in query)
                    {
                        Console.WriteLine("OrderId:{0},OrderDate:{1}", q.Id, q.OrderDate);
                    }
    Console.Read();
                }
            }
        }
    }
    

    运行结果:

    运行之后就会发如今server上多了一个“CodeFirstDb”数据库:

    这里写图片描写叙述



    三种模型的比較:

    这里写图片描写叙述



    上图很清晰的描写叙述了,三种模式的适用环境以及各自的特性,关于这三种方式并没有什么优劣,在应用的时候考虑项目本身的情况决定就可以。但值得一说的是CodeFirst的特性:运行时自己主动创建数据库。这一特性恰恰能够满足互联网软件多租户(云)的须要。兴许博客中会详细说明。





    代码下载

  • 相关阅读:
    Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造
    Codeforces Round #598 (Div. 3) F Equalizing Two Strings(构造题)
    codeforces round # 384 div2 B Chloe and the sequence 神奇二进制找规律题
    codeforces round #384 div2 C Vladik and fractions(构造)
    线段树板子
    Codeforces Round #616 (Div. 2) D (找规律题)
    codeforces round #616 div2 A (Even but not even)水题
    2017的计划清单
    回顾2016,我的简单总结
    关于ubuntu下sublime text 3 的安装和中文配置问题
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7283221.html
Copyright © 2020-2023  润新知