EntityFramework Code Firse 简单示例

1.示例项目概览

第一步,添加EntityFramework到项目中,一条命令搞定。打开Nuget控制台,输入如下语句:

PM> install-package entityframework

2.建立实体

首先,为各实体公共属性提取出来放在基类EntityBase中,所有实体继承自EntityBase。

public class EntityBase
    {
        //主键Id
        public int Id { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }

        public EntityBase()
        {
            CreateTime = DateTime.Now;
        }
    }            

Student实体代码如下:

 public class Student:EntityBase
    {
        public string Name { get; set; }
        public DateTime? Birthday { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
    }

Teacher实体代码:

public class Teacher:EntityBase
    {
        public string Name { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public string Subject { get; set; }

        public int StudentCount { get; set; }
    }

3.实体配置

同样,为了节省码量,实体配置也建一个基类MapBase<T>,所有实体配置类(继承自EntityBase)都继承基类EntityBase<T>,方便配置。

public class MapBase<T>:EntityTypeConfiguration<T>
        where T:EntityBase
    {
        public MapBase(string tableName=null)
        {
            //表名配置
            tableName = tableName ?? typeof (T).Name;
            ToTable(tableName);

            //关键配置(int 自增主键)
            HasKey(m => m.Id)
                .Property(m => m.Id)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        }
    }

表名默认为实体为,主键为int自增。

Student和Teacher实体的配置:

 public class StudentMap:MapBase<Student>
    {
        public StudentMap()
        {
            //属性配置
            Property(m => m.Name)
                .HasMaxLength(20)
                .IsRequired();
            Property(m => m.Address)
                .HasMaxLength(200)
                .IsRequired();
            Property(m => m.Email)
                .IsUnicode(false)
                .HasMaxLength(255);
            Property(m => m.Phone)
                .IsUnicode(false)
                .HasMaxLength(11)
                .IsRequired();
        }
    }
  public class TeacherMap:MapBase<Teacher>
    {
        public TeacherMap()
        {
            Property(m => m.Name)
                .HasMaxLength(20)
                .IsRequired();
            Property(m => m.Phone)
                .IsUnicode(false)
                .IsRequired();
            Property(m => m.Email)
                .IsUnicode(false)
                .HasMaxLength(255);
            Property(m => m.Subject)
                .HasMaxLength(50);
        }
    }

继承了EntityBase之后,主键的配置和表名的映射都由基类实现。这里说一下Fluent配置:IsUnicode(false)表示配置数据库字段类型为varchar,string类型的属性默认映射到数据库是nvarchar类型,更多Fluent相关的知识园子也很多,不多介绍。

4.EF数据操作上下文

实体配置完后,开始配置DbContext。

 public class CodeFirstDbContext:DbContext
    {
        /// <summary>
        /// 数据库连接配置
        /// </summary>
        public CodeFirstDbContext()
            :base("name=codeFirstConnectionStr")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //EF之前的写法
            //modelBuilder.Configurations.Add(new StudentMap());
            //modelBuilder.Configurations.Add(new TeacherMap());

            //EF6之后的写法
            modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly()); //加载当前运行的程序集配置
            //modelBuilder.Configurations.AddFromAssembly(typeof (MapBase<>).Assembly); //指定程序集加载配置
            base.OnModelCreating(modelBuilder);
        }
    }

EF6之后简化了model build,可以直接利用Configurations.AddFromAssembly()加载配置信息,不用再一一添加。

另外,ctor方法中的name=codeFirstConnectionStr中的codeFirstConnectionStr是数据连接字符串的名称,数据库连接配置如下:

<connectionStrings>
    <add name="codeFirstConnectionStr" providerName="System.Data.SqlClient" connectionString="server=.;database=CodeFirst_Demo;uid=sa;pwd=123456"/>
</connectionStrings>

5.生成数据库,操作EF上下文

到这里,所有相关的配置都完成了,接下来就是生成数据库并做相关操作了。

 class Program
    {
        static void Main(string[] args)
        {
            using (var ctx=new CodeFirstDbContext())
            {
                ctx.Database.CreateIfNotExists();

                ctx.Set<Student>().Add(new Student()
                {
                    Name = "张三",
                    Address = "深圳南山",
                    Birthday =DateTime.Now.AddYears(-20),
                    Email = "[email protected]",
                    Phone = "13888888888"
                });

                ctx.SaveChanges();
            }

            using (var ctx = new CodeFirstDbContext())
            {
                ctx.Set<Teacher>().Add(new Teacher()
                {
                    Name = "李四",
                    Email = "[email protected]",
                    Phone = "13899999999",
                    Subject = "软件工程:从入门到住院"
                });

                ctx.SaveChanges();
            }

            Console.Read();
        }
    }

生成之后的数据库是这样的:

数据也写了进去:

5.小结

这个示例非常简单,并没有涵盖EF的所有相关知识,比如导航属性、并发配置、数据迁移等。在实际的项目中,DbContext并不会直接暴露出去,还会用Reponsitory或Service作基础方法的封装,又或结合DDD放在基础设施层。

时间: 2024-11-08 23:05:33

EntityFramework Code Firse 简单示例的相关文章

HMM的维特比算法简单示例

今天读了一位大牛的关于HMM的技术博客,读完之后,写了一个关于维特比算法的简单示例,用scala和java语言混合编写的.现在上传之. package com.txq.hmm import java.utilimport scala.collection._ /** * HMM维特比算法,根据显示状态链条估计隐式链条 * @param states 隐式states * @param observations 显式states * @param start_probability 初始概率向量

Asp.Net EF Code First 简单入门

今天在上班期间花了点时间学习了一下微软的EntityFramework Code First技术,这篇文章只是简单的入门,不多废话,下面直入主题. 一.首先添加一个解决方案,接着添加一个web网站,DataAccess类库(用于数据访问),Model类库(实体层),结构如下: 二.安装EntityFramework.通过Nuget Package Manager进行安装(如果还没有安装Nuget的,可以通过tools-extension manager进行安装),在tools-Nuget Pac

SignalR 简单示例

原文:SignalR 简单示例 一.什么是 SignalR ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of adding real-time web functionality to applications. Real-time web functionality is the ability to have server code push content to connec

thrift简单示例 (基于C++)

这个thrift的简单示例, 来源于官网 (http://thrift.apache.org/tutorial/cpp), 因为我觉得官网的例子已经很简单了, 所以没有写新的示例, 关于安装的教程, 可以参考https://www.cnblogs.com/albizzia/p/10838646.html, 关于thrift文件的语法, 可以参考: https://www.cnblogs.com/albizzia/p/10838646.html. thrift文件 首先给出shared.thrif

ABAP分享一 弹出框函数的简单示例

在开发中经常会使用到弹出框这个功能,在SAP中有很多函数可以实现类似的功能,这里介绍一个比较简单常用的函数  POPUP_TO_CONFIRM 下面是一个实现的简单示例: TABLES sscrfields. DATA: qus TYPE string,           ans TYPE c.    " 根据用户的操作会有三个值   1   是   ,  2   否  ,  A   取消 SELECTION-SCREEN:BEGIN OF BLOCK abs WITH FRAME TITLE

AMQP消息队列之RabbitMQ简单示例

前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个图来概览下: 1.添加Maven依赖 <!-- rabbitmq begin --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit

spring-servlet.xml简单示例

spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 1 <!-- springMVC简单配置 --> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://w

关于Ajax实现的简单示例

一.代码示例 关于Ajax的基本概念(包括XMLHttpRequest对象及其相关方法属性)移步这里(w3school中文版)学习了解. <!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title>使用Ajax异步加载数据</title> <script type = "text/javasc

【转】bind简单示例

bind简单示例代码 namespace { class placeholder_ {}; placeholder_ __1; } template <typename R, typename T, typename Arg> class simple_bind_t { private: typedef R (T::*F)(Arg); F f_; T* t_; Arg& a_; public: simple_bind_t(F f, T* t, Arg &a) : f_(f),