注本文是学习旺杰兄的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. WPF:自动执行"机器人"程序若干注意事项

    企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据.定时对历史数据进行清理.定时向ftp上传业务数据... 这类程序,我习惯称为“机器 ...

  2. JavaScript系列:正则表达式

    function testExecResultType() { var txt = "mom and dad and baby"; var pattern = /mom (and ...

  3. 如何在batch脚本中嵌入python代码

    老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单: REM timeit.bat echo %TIME% ...

  4. 数据挖掘系列(9)——BP神经网络算法与实践

    神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...

  5. JVM内存管理------GC简介

    为何要了解GC策略与原理? 原因在上一章其实已经有所触及,就是因为在平时的工作和研究当中,不可避免的会遇到内存溢出与内存泄露的问题.如果对GC策略与原理不了解的情况下碰到了前面所说的问题,很多时候会让 ...

  6. Win7激活工具|OEM小马激活

    OEM小马激活,Win7激活. 免费下载:http://yunpan.cn/cmZ5DyDvXG2In  访问密码 7fcf

  7. ElasticSearch入门系列(五)数据

    序言:无论程序如何写,最终都是为了组织数据为我们服务.在实际应用中,并不是所有相同类型的实体的看起来都是一样的.传统上我们使用行和列将数据存储在关系型数据库中相当于使用电子表格,这种固定的存储方式导致 ...

  8. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  9. Android四大组件之Activity详解——创建和启动Activity

    前面我们已经对Activity有过简单的介绍: Android开发——初始Activity Android开发——响应用户事件 Android开发——Activity生命周期 先来看一下最终结果 项目 ...

  10. cmd 下telnet 不是内部或外部命令

    问题:cmd 下telnet 提示不是内部或外部命令 解决方案: