注本文是学习旺杰兄的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. 数据字典生成工具之旅(4):NPOI操作EXECL

    这篇会介绍NPOI读写EXECL,读写EXECL的组件很多,可以使用微软自己的COM组件EXECL.exe读写,不过这种方式限制很大. 1:客户环境必须装Office(虽然现在机子上不装Office的 ...

  2. 中国式IT的项目

    这篇文章用来总结一下2013,同时也分享一下我对中国IT项目现状的一些看法. 我先从项目说起.这里的项目主要是指的软件开发项目.我们分别从项目中的甲方和乙方谈谈,看看这两者对于项目.对应IT的认识和观 ...

  3. 一次莽撞的行为:在phpmyadmin中修改MySQL root密码后无法操作数据库

    一.手贱行为(✿◡‿◡) 在一次开发中通过xampp方式安装了PHP环境,需要操作数据库时通过phpmyadmin访问MySQL,在一次数据库操作时想起没有设置密码,于是直接在mysql数据库中的us ...

  4. 细数Javascript技术栈中的四种依赖注入

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道 ...

  5. mysql full text全文索引必要条件

    show variables like 'ft_m%' 'ft_max_word_len', '84''ft_min_word_len', '4' 对于英文来说, ft_min_word_len=4是 ...

  6. Javascript 模块化开发上线解决方案

    最近又换部门了,好频繁地说...于是把这段时间搞的小工具们简单整理了一下,作了一个小的总结.这次用一个简单业务demo来向大家介绍一下Javascript模块化开发的方式和自动化合并压缩的一些自己的处 ...

  7. JavaScript的理解记录(2)

    一.表达式与运算符: 1.对于属性访问表达式: var arr = {first:"hh","second":"gg",third:null ...

  8. python列表下标用法

    python中的列表下标实在太灵活了,要根据表象来分析它的内在机理,这样用起来才能溜.下标可以为负数有利有弊,好处是使用起来更简便,坏处是当我下表越界了我也不知道反倒发生奇奇怪怪的错误. print ...

  9. php - 上传图片之痛(建文件夹)

    $json_result ['status'] = 0; $path = '../upfile'; $json_result ['status'] = 0; $json_result ['succes ...

  10. 数据结构——动态链表(C++)

    定义一个节点: [cpp] view plain copy   print? #include <iostream> using namespace std; typedef int T; ...