注本文是学习旺杰兄的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. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  2. [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst

    一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...

  3. [转]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 ...

  4. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  5. EF CodeFirst增删改查之‘CRUD’

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇旨在学习EF增删改查四大操作 上一节讲述了EF ...

  6. EF CodeFirst 创建数据库

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    话说EF支持三种模式:Code First   M ...

  7. 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统

    本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...

  8. EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库

    前提:搭建成功codefirst相关代码,参见EF Codefirst  初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...

  9. EF CodeFirst系列(3)---EF中的继承策略(暂存)

    我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系 ...

  10. EF CodeFirst系列(6)---配置1对1,1对多,多对多关系

    这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通 ...

随机推荐

  1. JBOSS只能本机localhost和127.0.0.1能访问的解决

    一句话: %jboss_home%\bin>standalone.bat -Djboss.bind.address=0.0.0.0 也可以直接编辑standalone.xml,将里面所有127. ...

  2. spring发布和接收定制的事件(spring事件传播)

    spring发布和接收定制的事件(spring事件传播) 2012-12-26 20:05 22111人阅读 评论(2) 收藏 举报  分类: 开源技术(如Struts/spring/Hibernat ...

  3. [C]基本数据类型:整型(int)用法详解

    1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...

  4. 金山快盘+TortoiseSVN构建版本控制仓库

    金山会盘+TortoiseSVN构建版本控制仓库 之前写过一篇文章介绍 如何利用花生壳和VisualSVN Server建立远程代码仓库,具体请参照: <如何利用花生壳和VisualSVN Se ...

  5. FineUI参考手册(离线版)现已免费提供下载!

    http://fineui.com/bbs/forum.php?mod=viewthread&tid=3473

  6. OS存储器管理(二)

    离散分配 分页(Paging),分段,段页式 一.分页   一个进程的物理地址可以是非连续的:   将物理内存分成固定大小的块,称为块(frame): 将逻辑内存分为同样大小的块,称为页(page): ...

  7. BGP路由协议详解(完整篇)

    原文链接:http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文,曾许诺过要完善这个文档,但 ...

  8. learning to rank

    Learning to Rank入门小结 + 漫谈 Learning to Rank入门小结 Table of Contents 1 前言 2 LTR流程 3 训练数据的获取4 特征抽取 3.1 人工 ...

  9. Beta--项目冲刺第七天

    胜利在望-- 队伍:F4 成员:031302301 毕容甲 031302302 蔡逸轩 031302430 肖阳 031302418 黄彦宁 会议内容: 1.站立式会议照片: 2.项目燃尽图 3.冲刺 ...

  10. Git与GitHub到底有什么联系?

    Git与GitHub区别 git 是一个软件 版本控制器 分享合并代码, 团队开发 时间机器, 可以获取到任意阶段时间节点开发的代码, 代码找回 git, cvs, bitkeeper, svn 典型 ...