1.在数据库中新建两张测试表

创建用户表

use eftest
go
if exists(select * from sysobjects where name='UserInfo')
drop table UserInfo
create table UserInfo(
ID int identity(1,1) primary key,
UserName nvarchar(100) not null,
Sex char(1) default '男',
age int
)
go

创建订单表

use eftest
go
if exists (select * from sysobjects where name='OrderInfo')
drop table OrderInfo
create table OrderInfo
(
ID int identity(1,1) primary key,
UserID int not null ,
ThinName nvarchar(100) not null
)
go alter table OrderInfo
add constraint OrderInfo_fk_UserInfo foreign key(UserID) references UserInfo(ID)
select OrderInfo_fk_UserInfo

生成的ef中的几个重要文件

以及两个相关的类

EF 基础知识:

集合版实现ef的增加、修改、删除、查询

EfTestEntities content=new EfTestEntities();
var userInfo = new UserInfo
{
UserName = "admin1",age = ,Sex = "男"
};
content.UserInfo.Add(userInfo);
//通过主键查询记录
UserInfo userinfo=content.UserInfo.Find();
//修改数据
userinfo.UserName = "test123";
//删除记录,请注意,在调用此方法之前,该实体必须以另一种状态存在于该上下文中。
//即:该对象不能是自己实例创建的对象,必须是先查再删
content.UserInfo.Remove(userinfo); content.SaveChanges();

状态版实现增删改查

首先是来看DbContext中的两个方法

1.传如一个实体,返回一个被跟踪的实体(为什么在上面在删除的时候,如果删除的实体没处于上下文中,就会报错,而这个状态就是在这生成的,因为增加,修改,删除的实现,并不是马上就执行的,只是你在操作的时候,先把上下文对象的状态进行了改变,在最后提交时才去按照上下文生成sql语句执行

            //增加,通过更改实体的状态实现,上面集合的实现本质上也是这种是实现
context.Entry(userInfo).State = EntityState.Added;
context.SaveChanges(); //修改,建议使用,因为集合必须手动建立上下文跟踪后才能操作,而这个直接通过上下下文跟踪更直接
//但这个将通过主键修改对象所有的字段,比如下面没设置age和sex,那么将改为null
var useri = new UserInfo { ID = , UserName = "oldboy" };
context.Entry(useri).State = EntityState.Modified;
context.SaveChanges(); //同理删除也一样
var useri = new UserInfo { ID = , UserName = "oldboy" };
context.Entry(useri).State = EntityState.Deleted;
context.SaveChanges(); //状态版还能修改某一个列,而集合版修改必须的先查整个对象再修改
var useri = new UserInfo { ID = };
context.UserInfo.Attach(useri); //将对象加入上下文,默认为无状态(即不新增、也不修改、也不删除)
context.Entry(useri).Property("UserName").CurrentValue = "yearboy";
context.Entry(useri).Property("UserName").IsModified = true;
context.SaveChanges();
//状态

在DataContext中提供了Entity方法让我们来操作实体的状态

 /// <summary>
/// Gets a <see cref="DbEntityEntry{T}" /> object for the given entity providing access to
/// information about the entity and the ability to perform actions on the entity.
/// </summary>
/// <typeparam name="TEntity"> The type of the entity. </typeparam>
/// <param name="entity"> The entity. </param>
/// <returns> An entry for the entity. </returns>
public DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class
{
Check.NotNull(entity, "entity"); return new DbEntityEntry<TEntity>(new InternalEntityEntry(InternalContext, entity));
} /// <summary>
/// Gets a <see cref="DbEntityEntry" /> object for the given entity providing access to
/// information about the entity and the ability to perform actions on the entity.
/// </summary>
/// <param name="entity"> The entity. </param>
/// <returns> An entry for the entity. </returns>
public DbEntityEntry Entry(object entity)
{
Check.NotNull(entity, "entity"); return new DbEntityEntry(new InternalEntityEntry(InternalContext, entity));
}
 public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class
{
return (DbSet<TEntity>)InternalContext.Set<TEntity>();
} /// <summary>
/// Returns a non-generic <see cref="DbSet"/> instance for access to entities of the given type in the context
/// and the underlying store.
/// </summary>
/// <param name="entityType"> The type of entity for which a set should be returned. </param>
/// <returns> A set for the given entity type. </returns>
/// <remarks>
/// Note that Entity Framework requires that this method return the same instance each time that it is called
/// for a given context instance and entity type. Also, the generic <see cref="DbSet{TEntity}"/> returned by the
/// <see cref="Set"/> method must wrap the same underlying query and set of entities. These invariants must
/// be maintained if this method is overridden for anything other than creating test doubles for unit testing.
/// See the <see cref="DbSet"/> class for more details.
/// </remarks>
[SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Set")]
public virtual DbSet Set(Type entityType)
{
Check.NotNull(entityType, "entityType"); return (DbSet)InternalContext.Set(entityType);
}

两种语法的查询

查询语法

DbContext context1=new EfTestEntities();
//获取UserInfo的集合,等同 EfTestEntities 中的UserInfo集合
DbSet<UserInfo> users = context1.Set<UserInfo>();
var result = from info in users
where info.ID > && info.age != null
select info.OrderInfo;
Console.Write(result.Count());
 DbContext context1=new EfTestEntities();
//获取UserInfo的集合,等同 EfTestEntities 中的UserInfo集合
DbSet<UserInfo> users = context1.Set<UserInfo>();
var result = from info in context.UserInfo
join orde in context.OrderInfo on info.ID equals orde.UserID select info;
Console.WriteLine(result); var result1 = from info in context.UserInfo
from orde in info.OrderInfo select info;
Console.WriteLine(result1);

 var result1 = from info in context.UserInfo
from orde in info.OrderInfo
select new //new 新类
{
id = info.ID,
name = info.UserName
};

方法语法

var tt = context.UserInfo.Where(c => c.ID > 14).Select(c => new {c.ID, c.UserName});

  //分页
var re = context.UserInfo.
Where(c => c.ID > ).
OrderByDescending(c => c.ID)
.Skip().Take()
.Select(c => c);

Sql Server 表创建以及Ef浅谈的更多相关文章

  1. 05Microsoft SQL Server 表创建,查看,修改及删除

    Microsoft SQL Server 表创建,查看,修改及删除 创建表 创建普通表 use 数据库名称 go create table 表名称( 列1 ) not null, 列2 ) not n ...

  2. SQL server 表中如何创建索引?

    SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...

  3. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  4. SQL Server 表变量和临时表的区别

    SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...

  5. [转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

    原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Ser ...

  6. SQL Server表分区【转】

    转自:http://www.cnblogs.com/knowledgesea/p/3696912.html SQL Server表分区   什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在 ...

  7. sql server中创建链接服务器图解教程

    转自sql server中创建链接服务器图解教程 1.展开服务器对象-->链接服务器-->右击"新建链接服务器" 注意:必须以数据库管理员身份登录(通常也就是sa帐号) ...

  8. SQL SERVER表不能修改表结构的处理方法

    SQL SERVER表提示不能修改表结构,这究竟是什么原因呢?下面就为您介绍处理该问题的方法,如果您在SQL SERVER表修改方面遇到过问题,不妨一看. 新装的SQL SERVER 2008,打开原 ...

  9. SQL Server表分区详解

    原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...

随机推荐

  1. PHP:获取指定日期所在月的开始日期与结束日期

    /** * 获取指定日期所在月的开始日期与结束日期 * @param string $date * @param boolean 为true返回开始日期,否则返回结束日期 * @return arra ...

  2. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...

  3. Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)

    Linux 内核及内核编程(1) 成于坚持,败于止步 Linux 2.6 内核的特点 Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面. 1.新的调度器 2.6 ...

  4. 【Android LibGDX游戏引擎开发教程】第07期:中文字体的显示和绘制(上)

    在字体的显示和绘制中,Libgdx的作者(Mario Zechner,美国人)给我们提供了一个非常好用的工具 ——Hiero,那么下面就来看看它具体的使用方法. 一.Hiero工具的使用 1.Hier ...

  5. “Will not add file alias 'samefile' ('SameFile' already exists in index)” when `git add/commit` operation

    从远程仓库pull下来的代码有两个类类名首字母小写出现如下情况 然后我想删了重新写一下(就是把这个类删了,代码复制到名字正确的类里面),然后commit的时候出现这个错误,后来删一个commit一下, ...

  6. C语言之变量与常量的介绍

    一 标示符 标识符:可以理解为是变量名.名字常量表示法的常量名,但是不仅限于这两个 命名规范: 1.起名要有意义,基本要做到一看名字就知道是用来干嘛的(要求你遵守,但不会报错,希望能够养成这样的好习惯 ...

  7. SpringMVC 学习-上传文件分解器 CommonsMultipartResolver 类

    Spring 组件 CommonsMultipartResolver 类的主要作用是配置文件上传的一些属性,也可以控制上传文件的大小. 在 springmvc-servlet.xml 配置文件中: & ...

  8. XtraBackup增量备份

    mysql:5.6.29xtrabackup:2.2.10mysql数据目录:/data/mysqlmysql备份目录:/data/dbbak/ #确保有足够的磁盘空间 官方文档:https://ww ...

  9. WPF中override ResourceDictionary中的设置的方法

    当资源文件里改变了控件的样式时,在使用的地方如果想改变资源文件里修改的内容,会造成无法达到预期目的的结果. 以DataGrid为例,我在资源文件里,改变了默认的DataGrid的样式,其中我设置了Is ...

  10. 2016 ACM/ICPC Asia Regional Qingdao Online 1005 Balanced Game

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...