Entity Framework:代码优先
一、代码优先Code First
EF6支持Oracle ODT 12C Release 3 (net4.5)
DataModel(类)——》生成数据库DB
或
存在的数据库DB——》生成的数据模型(类)
二、创建或生成Model代码
(可利用Entity FrameWork Power Tools 生成Model代码)
先安装EFTools6.1ForVS2012 ,EF6.1版以上用EntityFramework.CodeTeplates.Csharp及自带的模板。
方式1、使用标注
/// <summary>
/// 景点类
/// </summary>
[Table("DESTINATIONS", Schema = "PAMS")]
public class Destination
{
[Column("DESTINATIONID", TypeName = "INT")]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DestinationId { get; set; } [Column("NAME")]
public string Name { get; set; } [Column("COUNTRY")]
public string Country { get; set; } [Column("DESCRIPTION")]
public string Description { get; set; } [Column("PHOTO")]
public byte[] Photo { get; set; } public virtual List<Lodging> Lodgings { get; set; }
} /// <summary>
/// 住宿类
/// </summary>
[Table("LODGINGS", Schema = "PAMS")]
public class Lodging
{
[Column("LODGINGID", TypeName = "INT")]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int LodgingId { get; set; } [Column("NAME")]
public string Name { get; set; } [Column("OWNER")]
public string Owner { get; set; } [Column("TARDESTINATIONID", TypeName = "INT")]
public int? DestinationID { get; set; } [ForeignKey("DestinationID")]
public Destination Destination { get; set; }
} /// <summary>
/// 度假村类
/// </summary>
public class Resort : Lodging
{
[Column("ENTERTAINMENT")]
public string Entertainment { get; set; }
} /// <summary>
/// 宿舍类
/// </summary>
public class Hostel : Lodging
{
[Column("MAXROOM", TypeName = "INT")]
public int? MaxRoom { get; set; }
}
方式2:使用模板Builder
public class BreakAwayContext : DbContext
{
public DbSet<CodeFirst.Model.Destination> Destinations { get; set; }
public DbSet<CodeFirst.Model.Lodging> Lodgings { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new DestinationMap());
modelBuilder.Configurations.Add(new LodgingMap());
}
}
public class DestinationMap : EntityTypeConfiguration<CodeFirst.Model.Destination>
{
public DestinationMap()
{
this.HasKey(t => t.DestinationId);
Property(d => d.Name).IsRequired();
Property(d => d.Description).HasMaxLength();
} }
public class LodgingMap : EntityTypeConfiguration<CodeFirst.Model.Lodging>
{
public LodgingMap()
{
this.HasKey(t => t.LodgingId);
Property(d => d.Name).IsRequired();
Property(d => d.Owner).HasMaxLength();
this.Map<Lodging>(d => d.Requires("TYPE").HasValue("Standard"));
this.Map<Resort>(d => d.Requires("TYPE").HasValue("Resort"));
this.Map<Hostel>(d => d.Requires("TYPE").HasValue("Hostel"));
}
}
三、配置文件
<connectionStrings>
<add name=”BreakAwayContext ”, conectionstring=”” providerName=””>
</connectionStrings>
四、操作
1、添加
var destination = new CodeFirst.Model.Destination
{
Country = "Indonesia",
Description = "EcoTourism at its best in exquisite Bali",
Name = "Bali"
};
using (var context = new CodeFirst.DataAccess.BreakAwayContext())
{
if (context.Destinations.Count((t => t.Name == "Bali") < )
{
context.Destinations.Add(destination);
context.SaveChanges();
}
}
2、修改
using (var context = new CodeFirst.DataAccess.BreakAwayContext())
{
var canyon = (from d in context.Destinations where d.Name == "Bali" select d).Single();
canyon.Description = "227 mile long canyon.";
context.Entry(gw)=EntityState.Modified;
context.SaveChanges();
}
3、删除
using (var context = new CodeFirst.DataAccess.BreakAwayContext())
{
//var toDelete = new CodeFirst.Model.Destination { d.Name="Bali"};
//context.Destinations.Attach(toDelete); //attach,状态由added改为unchanged
//context.Destinations.Remove(toDelete);
//context.SaveChanges(); context.Database.ExecuteSqlCommand("delete from pams.DESTINATIONS where Name='Bali'");//直接执行sql, }
五、查询
1、Load方法把数据加载到内存(LINQ写法,同foreach)
using (var context = new CodeFirst.DataAccess.BreakAwayContext())
{
var query = from d in context.Destinations where d.Country == "Australia" select d;
query.Load();// foreach 也可以
var count = context.Destinations.Local.Count;
}
2、ToList()一次性从数据库中查出数据
var Invoices=ctx.Invoie.ToList();
foreach(var result in Onvoices)
{.}
3、Find方法根据键值先从内存中查询,内存中没有才查询数据库。
var destination = context.Destinations.Find();
4、Single(),SingleOrDefault(),First()等可根据条件直接从数据库查。
var destination = context.Destinations.SingleOrDefault(d => d.Name == "Bali");
六、直接执行SQL语句
1、context.Database.ExecuteSqlCommand("delete from pams.DESTINATIONS where Name='Bali'");//直接执行sql,
2、 IEnumerable<Lodging> a=context.Database.SqlQuery(“Select * from ..”) 可直接转为定义的实体类型,任何类型,EF不跟踪
3、DbSqlQuery<Lodging> c=context.Lodging.SqlQuery(“select* from ..) EF跟踪返回的对象。
4、modelBuilder.Entity<singleEntity>().HasEntitySetName(“MyEntity”) 创建实体集不需要在DBContext中定义
IEnumerable<Lodging> a=(Context as IObjectContextAdapter).ObjectContext.CreateQuery<Lodging>(“select * from ..”) 这以后的linq查询条件可合并为一个SQL
Entity Framework:代码优先的更多相关文章
- Entity Framework 代码先行
一.什么是Code First 为了支持以设计为中心的开发流程,EF还更多地支持以代码为中心 (code-centric) ,我们称为代码优先的开发,代码优先的开发支持更加优美的开发流程,它允许你在不 ...
- Linq to Entities,ADO.NET Entity Framework 模型优先
一.概念: Database First(数据库优先):存在的DB------------->生成Data Model .edmx文件 Model First(模型优先):Data Model ...
- Entity Framework 代码先行之约定配置
要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...
- C# ORM—Entity Framework 之Code first(代码优先)(二)
一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...
- Entity Framework Code first(转载)
一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...
- Entity Framework 6.X实现记录执行的SQL功能
Entity Framework在使用时,很多时间操纵的是Model,并没有写sql语句,有时候为了调试或优化等,又需要追踪Entity framework自动生成的sql(最好还能记录起来,方便出错 ...
- 使用Entity Framework 4进行代码优先开发
[原文地址]Code-First Development with Entity Framework 4 .NET 4随带发布了一个改进版的Entity Framework(EF)- 一个位于Sy ...
- Entity Framework 之Database first(数据库优先)&Model First(模型优先)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
随机推荐
- redis系统和通用函数
construct函数: 用来创建一个redis客户端. redis = new Redis(); connect函数:连接到一个redis实例. 参数如下: host:字符串类型 可以使一个HO ...
- 开始使用 Vuejs 2.0 ---简单总结1
Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vuejs 采用自底向上增量开发的设计.Vuejs 的核心库只关注视图层,并且非常容 ...
- android studio全局搜索关键字
- CSS3 图标神器 => content:"我是特殊符号"
基本形状 ▲ 9650 25B2 ► 9658 25BA ► 9658 25BA ▼ 9660 25BC ◄ 9668 25C4 ❤ 10084 2764 ✈ 9992 2708 ★ 9733 260 ...
- 初学SpringMVC,使用MVC进行文件上传
最近在做一个文件上传的功能,走了不少弯路,话不多说,直接上代码: 导入各种jar包,首先是applicationContext.xml配置文件中: <!-- 配置文件解析器 --> < ...
- Grpc helloworld demo的经验
GreeterGrpc.java这个文件是插件protoc-gen-grpc-java生成的 刚开始直接用类似如下的指令无法生成GreeterGrpc.java文件 protoc --java_ou ...
- 前端(十一):props、state及redux关系梳理
所谓状态机,是一种抽象的数据模型,是“事物发展的趋势”,其原理是事件驱动.广泛地讲,世界万物都是状态机. 一.状态机是一种抽象的数据模型 在react中,props和state都可以用来传递数据.这里 ...
- scrum 项目的基本模式
scrum 项目中有 3 个主要的角色:产品所有者, Scrum 主管和团队成员 产品所有者和团队其他成员一起工作,负责维护生产积压工作表 (production backlog) ,并对表中的项制定 ...
- hdu 4190 Distributing Ballot Boxes 二分
Distributing Ballot Boxes Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu 2199 Can you solve this equation? 二分
Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...