Entity Framework的一个实例
环境:Visual studio2013+sql server本地数据库
创建一个C#应用程序,首先在nuget中添加Entity Framework
接下来的工作分为四个主要部分:
第一部分:App.config
这个文件在创建时会自动生成,我们要做的是在其中增加一个代表数据库连接字符串的标签
格式:
<connectionStrings>
<add name="CodeFirstDemo" connectionString="Server=DESKTOP-NJVJDDB;Database=mydatabase01;IntegratedSecurity=SSPI" providerName="System.Data.SqlClient"/>
</connectionStrings>
添加到<configuration>标签下
格式的解释:
在<connectionStrings>中有一些固定的属性值,可以看定义了解。其中必须的为name属性和connectionString属性,其余属性均为可选项
name:代表这个<connectionStrings>的名字,主要作用是在其他地方引用时使用
connectionString:用于配置和数据库的连接。主要有三个属性:
- DataSource(Server):数据库服务器名
- InitialCatalog(Database):服务器中的数据库名
- IntegratedSecurity:安全策略,有五个值:true/yes/false/no/SSIP,其中SSIP和true的含义是一样的,都是指将安全策略设置为Windows身份验证,这时设置的user id和password将不起作用。否则将是用用户名和密码登陆数据库的安全策略
第二部分:实体类文件
这是一系列C#类文件,和数据库的表对应,其中的属性对应于表的属性,用于在工作空间中存储数据,在最终生成程序时会根据这个生成表
值得注意的是,数据库在创建表时主键会默认为自增,这时插入数据会自动生成主键值,插入主键会导致异常,要设置为非自增才可以自主设置主键
在实体类的主键前加入:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations.Schema;//设置生成表属性使用的命名空间
namespace MiniProfilerDemo.Models
{
public class Install
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)]//这是设置不自动增长的语句
public int ID { get; set; }
public string City { get; set; }
public string Type { get; set; }
public Install(int ID,string City,string Type)
{
this.ID = ID;
this.City = City;
this.Type = Type;
}
public Install() { }
}
}
第三部分:Context文件
这个文件是要自己创建一个C#类文件
继承自DbContext类,这个类是用于连接数据库和程序的中介,用于查询数据库或是将更改组合成一个单元再写回数据库
A DbContext instance represents acombination of the Unit Of Work and Repository patterns such that it can beused to query from a database and group together changes that will then bewritten back to the store as a unit.
构造函数:在创建这个类的时候创建对数据库的连接,调用其父类(DbContext)的构造方法:
//public DbContext(stringnameOrConnectionString);
/*Constructs a new context instance using the given string as the name or connection string
for the database to which aconnection will be made.
See the class remarks for how this is used to create a connection.*/
//如:
public EFDbContext() : base("name =ASimpleDB") { }
参数用于索引在App.config添加的数据库连接字符串
数据(DBSET):
由如下的属性组成,T表示实体类名,这些属性组成DbContext代表的数据库
public DbSet<T> T { get; set; }…
Mapper类添加:如果在程序中还添加了Mapper类文件,那么就要在这里将类文件加入到Context文件中。这个部分不是必要的
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new InstallMapper());//添加映射,InstallMapper就是我添加的Mapper类文件
}//映射
我的Context文件示例:
//DbContext数据库上下文,定义了从实体对象到数据库的映射,从数据库中检索数据,就要使用它。
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//我的程序的命名空间
using MiniProfilerDemo.Models;
using MVCDemo.Mapper;
namespace MiniProfilerDemo.DAL
{
public class EFDbContext : DbContext//继承自DbContext
{
//构造函数: public DbContext(string nameOrConnectionString);
//base调用基类构造函数,参数为nameOrConnectionString
//本函数使用的是ConnectingString,位置在Web.config
//name是指这个连接的名字
public EFDbContext() : base("name = ASimpleDB") { }
//添加实体类,表示工作空间的数据区
#region DBSET
public DbSet<Install> Install { get; set; }
#endregion
//添加Mapper类,将数据库映射到类
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new InstallMapper());//添加映射
}//映射
}//class
}
第四部分:控制逻辑
既然是一个简单的实例,那么就在自动生成的主程序入口program.cs中添加控制逻辑
在执行之前需要创建一个DbContext类,并以此类来操作
需要注意的是,在执行对数据库的修改操作之后还要调用.SaveChanges()方法来保存更改
示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//我的程序的命名空间
using CodeFirstDemo.Model;
namespace CodeFirstDemo
{
class Program
{
static void Main(string[] args)
{
using (var context = new CodeFirstContext())//创建一个context对象
{
context.Database.CreateIfNotExists();//如果数据库不存在时则创建
TRoles t = new TRoles();
t.Id = 1;
t.RoleName = "aa";
context.Roles.Add(t);//在Roles表中添加条目
context.SaveChanges();//保存添加
}
Console.Write("DB has Created!");//提示DB创建成功
Console.Read();
}//Main
}//class Program
}//namespace
(可选)第五部分:Mapper文件
设置Mapper类,每一个实体类对应一个Mapper类
继承自EntityTypeConfiguration<实体类名>
在其中创建无参的构造函数,在其中进行对应的实体类和数据库表的映射。用其父类的方法来设置映射的表、属性和设置主键等
如:this.ToTable(“表名”):将这个实体类映射到数据库的参数代表的表
需要注意的是:
Mapper文件中的this.ToTable();方法有两种
//第一种:代表的数据库名:tableName
public EntityTypeConfiguration<TEntityType>ToTable(string tableName);
//第二种:这种代表的数据库名会有一个前缀即 schemeName.tableName
public EntityTypeConfiguration<TEntityType>ToTable(string tableName, string schemaName);
示例:
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
//我的程序的命名空间
using MiniProfilerDemo.Models;
namespace MVCDemo.Mapper
{
internal class InstallMapper : EntityTypeConfiguration<Install>
{
internal InstallMapper()
{
this.ToTable("Install");
this.HasKey(t => t.ID );
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.City).HasColumnName("City");
this.Property(t => t.Type).HasColumnName("Type");
}
}
}
源码:
https://github.com/biaoJM/ASP.NET-MVC-DEMO/tree/master/MVCDemo/MVCDemo
Entity Framework的一个实例的更多相关文章
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...
- 实体框架(Entity Framework)快速入门--实例篇
在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...
- 分享使用Entity Framework的一个坑:Include无效
如果不想延迟加载,可以通过设置:context.Configuration.LazyLoadingEnabled = false;或查询时加上AsNoTracking()方法即可. 如果不想生成代理, ...
- Entity Framework的一个坑
由于业务需要写了一个批量数据导入工具.中间踩了一个坑 问: 1. SaveChange 实体A 发生pk冲突,异常了.2.记录日志3.不让退出程序,继续处理下一个实体4.Add新的实体B5.再次调用S ...
- 8天掌握EF的Code First开发之Entity Framework介绍
返回<8天掌握EF的Code First开发>总目录 本篇目录 Entity Framework概要 什么是ORM Entity Framework简史 Entity Framework具 ...
- Entity Framework Core 1.1 Preview 1 简介
实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本. 10月25日,Entity Framework Core 1.1 Preview 1发布了. 升级到 ...
- MVC5 Entity Framework学习之Entity Framework高级功能(转)
在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...
- Entity Framework 全面教程详解(转)
目录 预备知识 2 LINQ技术 2 LINQ技术的基础 - C#3.0 2 自动属性 2 隐式类型 2 对象初始化器与集合初始化器 3 匿名类 3 扩展方法 ...
- 转载 8天掌握EF的Code First开发之Entity Framework介绍
转载原地址: http://www.cnblogs.com/farb/p/IntroductionToEF.html Entity Framework概要 Entity Framework是微软的O ...
随机推荐
- MYSQL binlog 日志内容查看
记录mysql数据库真正执行更改的所有操作(DML语句),不包含那些没有修改任何数据的语句,不会记录select和show这样的语句. 二进制日志的作用: 1. 可以完成主从复制的功能 2. 进行恢复 ...
- 接入gitment为hexo添加评论功能
title: 接入gitment为hexo添加评论功能 toc: false date: 2018-04-16 10:59:56 categories: methods tags: hexo gitm ...
- Hbase项目(完整版)
涉及概念梳理:命名空间 4.1.1.命名空间的结构 1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中. 2) RegionSe ...
- 为什么不针对internal接口写单元测试?
测试驱动的开发(TDD,Test Driven Development)的核心理念,是要使得重构(refactoring)更为有效,而不是创建更多的测试. 对一个有着长生命周期的项目来讲,在它的第一个 ...
- spark thrift server configuration
# MainApplicationProperties # --master yarn --deploy-mode client 下的配置, client 模式表示,driver 是在本地机器上跑的, ...
- 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
前置问题:51nod 1102 面积最大的矩形 附上链接: 51nod 1102 面积最大的矩形 这题的题解博客 需要了解的知识:单调栈,在前置问题中已经讲解. 解题思路 对每行求左边连续1的个数,得 ...
- SQL 中多个 and or 的组合运算
sql关系型运算符优先级高到低为:not >and> or AND.OR运算符的组合使用 在WHERE子句中,通过AND.OR运算符可以同时连接多个条件,当然AND.OR运算符也可以同时使 ...
- Jquery 设置class 和 div CSS
Jquery 设置class 和 div CSS 1 Jquery 根据标签内容获取标签div,从而修改该div CLASS //追加 $('label:contains("labelcon ...
- Eclipse安装Web插件
方法/步骤 本次安装教程,我把所有的步骤都写在了图片中,大家仔细查看图片即可,希望能帮到大家 1.选择菜单栏上的“Help” 选择Install New Software 在弹出的 ...
- .NET Framework 3.5 无法安装以下功能 安装错误:0x800F0906(客户端加域后出现)
问题:安装错误:0x800F0906 系统安装并加域后,在安装用友软件时提示没有.net 3.5 系统为win10 但是,点击确定后,却出现了这样的错误.如下: 点击下载并安装此功能,出现了这样 ...