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 ...
随机推荐
- R学习小计
安装R扩展包:install.packages("FKF")http://www.douban.com/note/243004605/1.输入数据 l读入有分隔符数据:A<- ...
- 你不知道的JavaScript(一)数据类型
ECMAScript 规范地址: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 有过WEB前端开发 ...
- RabbitMQ笔记(3)
消息从产生--->结束 1.生产者--->交换机--->队列--->消费者 2.生产者--->交换机--->队列 首先: 生产者:Exchange = n:1 Ex ...
- 编 写高性能的 SQL 语句注意事项
1. IS NULL 与 IS NOT NULL不能用 null 作索引, 任何包含 null 值的列都将不会被包含在索引中. 即使索引有多列这样的情况下,只要这些列中有一列含有 null,该列就会从 ...
- js或者jq 使用cookie 时在谷歌浏览器不好使
用js或者jq 写cookie时在谷歌浏览器上打开,cookie不能正常使用. 原因:浏览器没有开启cookie,打开cookie 就可以显示 其次,当将代码上传至服务器,再用浏览器打开时,cooki ...
- Linux下重启mysql数据库的方法
原文地址:Linux下重启mysql数据库的方法作者:于士博的视频教程 方法一: 命令: [root@localhost /]# /etc/init.d/mysql start|stop|rest ...
- LightOJ-1138 Trailing Zeroes (III) 唯一分解定理 算n!的某个因数个数
题目链接:https://cn.vjudge.net/problem/ 题意 找一个最小的正整数n 使得n!有a个零 思路 就是有几个因数10呗 考虑到10==2*5,也就是说找n!因数5有几个 数据 ...
- 平衡二叉树(AVLTREE,双链表实现)
首先说下好久没更新了,最近打游戏和工作都有点多,o(^▽^)o. 写这个AVL发现自己的代码风格好差,尤其是变量命名这块,后来意识到了,想去改,但是太多了,改了几个就不想改了,做这个是记录下自己的成长 ...
- DataTable 数据导入MS ACCESS 数据库中 数字类型字段为空的解决办法
string strSql = "insert into GongCheng (GCSY,GCBH,GCBHOLD,GCMC,GCKCJD,GCJSDW,GCSJDW,GCKCDW,GCSG ...
- 待字闺中之Magic Index 分析
给定一个数组A,当中有一个位置被称为Magic Index,含义是:如果i是Magic Index.则A[i] = i. 如果A中的元素递增有序.且不反复,请给出方法,找到这个Magic Index. ...