EF-CodeFirst-1 玩起来
注本文是学习旺杰兄的CodeFirst系列所写
CodeFirst
CodeFirst是一种全新的玩法,代码先行使得我们更了解实体之间的关系。而且更加符合了DDD领域驱动设计的思想 。所以CodeFirst已经成为了一种趋势。
简单玩法
打开Visual Studio新建一个类库,然后新建项目 ADO.NET实体数据模型-->空的CodeFirst模型
这里定义了两个实体 User与UserRole,字段UserRoles、User代表着一个User可以拥有多个UserRole。而一个UserRole对应着一个User。这里有一个外键关系
然后需要在我们的刚才新建的项目类中加上这样两行代码,熟悉的朋友看到这里会很明显的感觉到这就是DbFirst生成的Context
然后别忘了在config中加上连接字符串,加上后就可以嗨皮去了!!
最后在MVC项目中(其它的也可以) 进行添加一个数据试试看。运行过后去数据库里就可以看到这个库以及我们添加的记录了
注:如果报错 正在创建此模型,此时不可使用上下文…. ,请在程序包管理器控制器使用命令 Updata-Base 。下面会有一系列操作按照提示来就可以了
实体的一些配置
我们在数据库新建表的时候,往往会给字段设置主建、非空、数据类型大小等。在这里也可以做到。上面我们使用了Data Annotations。
Data Annotations 翻译后就是数据注解。可以使用Attribute在实体类上进行注解
比如
[key] 、[Required]、[Table]等
还用一种就是使用Fluent API (流利的API),在DbContext中定义的数据库配置映射的一种方式。在集成自DbContext的类中重写OnModelCreatring方法
这样配置有些麻烦,因为每个实体类都要在这边写上一行,慢慢的越来越大不说,还不便于维护,一堆代码这么多我想修改其中某个实体类的话还需要去翻找上一阵子。这就比较尴尬了。
好的方法是为每个实体类单独的做配置然后在这边进行统一管理即可
- 新建继承自EntityTypeConfiguration<>的类,建议以实体类名+Map结尾
- 在类的构造函数中进行编写配置
- 添加到上下文的OnModelCreating方法中
一些配置的玩法,即用即看
//【主键】
//Data Annotations:
[Key]
public int DestinationId { get; set; }
//Fluent API:
public class
BreakAwayContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder
modelBuilder)
{
modelBuilder.Entity<Destination>().HasKey(d => d.DestinationId);
}
}
//【外键】
//Data Annotations:
public int DestinationId { get; set; }
[ForeignKey("DestinationId")]
public Destination Destination { get; set; }
//Fluent API:
modelBuilder.Entity<Lodging>().HasRequired(p =>
p.Destination).WithMany(p=>p.Lodgings).HasForeignKey(p => p.DestinationId);
//【长度】
//Data Annotations:通过StringLength(长度),MinLength(最小长度),MaxLength(最大长度)来设置数据库中字段的长度
[MinLength(10),MaxLength(30)]
public string Name { get; set; }
[StringLength(30)]
public string Country { get; set; }
//Fluent API:没有设置最小长度这个方法
modelBuilder.Entity<Destination>().Property(p => p.Name).HasMaxLength(30);
modelBuilder.Entity<Destination>().Property(p
=> p.Country).HasMaxLength(30);
//【非空】
//Data Annotations:
[Required(ErrorMessage="请输入描述")]
public string Description { get; set; }
//Fluent API:
modelBuilder.Entity<Destination>().Property(p => p.Country).IsRequired();
//【数据类型】
Data Annotations:
将string映射成ntext,默认为nvarchar(max)
[Column(TypeName = "ntext")]
public string Owner { get; set; }
//Fluent API:
modelBuilder.Entity<Lodging>().Property(p => p.Owner).HasColumnType("ntext");
//【表名】
//Data Annotations:
[Table("MyLodging")]
public class Lodging
{
}
//Fluent API
modelBuilder.Entity<Lodging>().ToTable("MyLodging");
//【列名】
//Data Annotations:
[Column("MyName")]
public string Name { get; set; }
//Fluent API:
modelBuilder.Entity<Lodging>().Property(p => p.Name).HasColumnName("MyName");
//【自增长】
//Data Annotations
[Key,
DatabaseGenerated(DatabaseGeneratedOption.Identity)] Guid类型的主键、自增长
public Guid SocialId { get; set; }
//Fluent API:
modelBuilder.Entity<Person>().Property(p =>
p.SocialId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
//【忽略列映射】
//Data Annotations:
[NotMapped]
public string Name
{
get
{
return FirstName + " " + LastName;
}
}
//Fluent API:
modelBuilder.Entity<Person>().Ignore(p => p.Name);
//【忽略表映射】
//Data Annotations:
[NotMapped]
public class Person
{ }
//Fluent API:
modelBuilder.Ignore<Person>();
//【时间戳】
//Data Annotations:Timestamp
[Timestamp]
public Byte[] TimeStamp { get; set; } 只能是byte类型
//Fluent API:
modelBuilder.Entity<Lodging>().Property(p => p.TimeStamp).IsRowVersion();
//【复杂类型】
//Data Annotations:
[ComplexType]
public class Address
{
public string Country { get; set; }
public string City { get; set; }
}
//Fluent API:
modelBuilder.ComplexType<Address>();
EF-CodeFirst-1 玩起来的更多相关文章
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst
一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...
- [转]Using Entity Framework (EF) Code-First Migrations in nopCommerce for Fast Customizations
本文转自:https://www.pronopcommerce.com/using-entity-framework-ef-code-first-migrations-in-nopcommerce-f ...
- EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...
- EF CodeFirst增删改查之‘CRUD’
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇旨在学习EF增删改查四大操作 上一节讲述了EF ...
- EF CodeFirst 创建数据库
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 话说EF支持三种模式:Code First M ...
- 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统
本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...
- EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库
前提:搭建成功codefirst相关代码,参见EF Codefirst 初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...
- EF CodeFirst系列(3)---EF中的继承策略(暂存)
我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has a”和“is a”关系 ...
- EF CodeFirst系列(6)---配置1对1,1对多,多对多关系
这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通 ...
随机推荐
- Android开发:在EditText中关闭软键盘 转来的
1.EditText有焦点(focusable为true)阻止输入法弹出 editText=(EditText)findViewById(R.id.txtBody); editText.setOnTo ...
- C#微信公众号开发系列教程四(接收普通消息)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 记一次使用命令行启动部署在tomcat上的应用
在Eclipes进行程序开发完成后,一般都会直接在Eclipse部署启动,其中的一些启动参数设置都会在其中进行,若用命令行启动,则需要手动配置. 程序开发完成后打成的war包,需要部署到Tomcat应 ...
- linux初级,连网
第一次写,今天刚好装上centos,然后就玩装一些软件,但要联网,所以琢磨了半天连网,下面总结下今天积累的一些知识点吧! 首先需要查看电脑有没有装驱动:ifconfig -a, 看有没有eh0(网卡) ...
- display:block、display:inline与displayinline:block的概念和区别
总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...
- 1018MYSQL数据迁移到SQLSERVER
-- 第一步利用MYSQL将数据结果的脚本迁移出来-- 第二步利用POWERDESGINER的反向功能,将脚本生成为物理模型 FILE-REVERSE DATEBASE -- 第三步将物理模型生成SQ ...
- 《Javascript DOM编程艺术》 读书笔记 —— 好书,通俗易懂!!!!! 相当的严谨!!!!
1.javascript弱类型语言,解释性语言. 2.javascript数据类型:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空( ...
- Hibernated的sql查询
记录一下学习Hibernate的心得 1.为什么HIbernate会支持原生态的sql查询? HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中, ...
- 开发错误记录9:Application无法跳转到Activity
今天在做友盟消息推送,当客户端收到推送消息时,如客户端不是活动的,用如下代码 启动Activity发现无法启动,原因是原有的任务栈已消毁,判断启动是如消毁,如有,再新建一个 只要给它添加一个标志 就可 ...
- ActiveMQ_点对点队列(二)
一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式 二.配置信息 1 ...