EntityFramework实体映射到数据库

在Entity Framework Code First与数据表之间的映射方式实现:

1、Fluent API映射

通过重写DbContext上的OnModelCreating方法来访问Code First Fluent API

例如:

    public class BlogDbContext: DbContext
{
public BlogDbContext() : base("BlogDbContext") { } public DbSet<BlogUser> BlogUser{ get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogUser>().HasKey(k => k.BlogUserId) //主键
.Property(q => q.BlogName).IsRequired();//不能为空
}
}

demo中的property方法用于为每个属于实体或复杂类型的属性配置特性。Property 方法用于获取给定属性的配置对象。配置对象上的选项特定于要配置的类型;例如,IsRequired表示不可为空。

  1. ToTable - TableAttribute:配置此实体类型映射到的表名
  2. HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称
  3. HasForeignKey - ForeignKeyAttribute:将关系配置为使用在对象模型中的外键属性。如果未在对象模型中公开外键属性,则使用Map方法
  4. Ignore - NotMappedAttribute:从模型中排队某个属性,使该属性不会映射到数据库
  5. HasRequired:通过此实体类型配置必需关系。除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。
  6. HasOptional:从此实体类型配置可选关系。实体类型的实例将能保存到数据库,而无需指定此关系。数据库中的外键可为null。
  7. HasMany:从此实体类型配置一对多关系。
  8. WithOptional:将关系配置为required:optional。(required:0…1端的1,表示必需,不可为null;optional:0…1端的0,表示可选,可为null。下同)
  9. WithOptionalDependent:将关系配置为optional:optional。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。
  10. WithOptionalPrincipal:将关系配置为optional:optional。要配置的实体类型将成为关系中的主体。作为关系目标的实体类型将成为依赖对象,且包含主体的外键。
  11. WithRequired:将关系的指定端配置为必需的,且在关系的另一端有导航属性。
  12. WithRequiredDependent:将关系配置为required:required。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。
  13. WithRequiredPrincipal:将关系配置为required:required。要配置的实体类型将成为关系中的实体。作为关系目标的实体类型将成为依赖对象,且包含主体的外键。
  14. WillCascadeOnDelete:配置是否对关系启用级联删除。
  15. Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。
  16. MapKey:配置外键的列名。
  17. ToTable:配置外键列所在表的名称和架构

参考资料:https://msdn.microsoft.com/zh-cn/library/gg696117

如果这时候需要修改BlogUser这个实体,比如添加一个字段的时候直接运行就会报错,此时需要进行数据库更新迁移

建一个迁移类

using BlogDemo.Repositories;
using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Web; namespace BlogDemo.Migrations
{
public class Configuration:DbMigrationsConfiguration<BlogDbContext>
{
/// <summary>
/// 初始化一个<see cref="MigrationsConfiguration"/>类型的新实例
/// </summary>
public Configuration()
{
//启用自动迁移
AutomaticMigrationsEnabled = true;
//获取或设置一个值表示如果在自动数据丢失是可以接受的 [慎重设置]
AutomaticMigrationDataLossAllowed = true;
}
}
}

同时也需要在Global.asax里面添加应用程序初始化的时候把数据库更新为最新的办法

        protected void Application_Start()
{
//数据库初始化为最新的版本
Database.SetInitializer(new MigrateDatabaseToLatestVersion<BlogDbContext,Configuration>());
AreaRegistration.RegisterAllAreas(); // 默认情况下对 Entity Framework 使用 LocalDB
//Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

这个时候基本的操作可以实现,但是在实际的项目中数据表肯定不止一两张,几十张甚至上百张,如果按照这样的配置方法,需要配置映射关系的时候在 BlogDbContext的OnModelCreating进行配置,到后面在OnModelCreating方法中会添加很多关系

所以此时的解决方法就是新加一个映射类,在这个类中引用EntityTypeConfiguration,其实在BlogDbContext的OnModelCreating中有一句代码是modelBuilder.Entity<BlogUser>().HasKey(m => m.BlogUserId);   haskey转到定义可看到aaarticlea/png;base64,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" alt="" width="886" height="302" />

所以在这里引用EntityTypeConfiguration是为了可以在构造方法中写配置,如下:

    public class BlogUserConfiguration : EntityTypeConfiguration<BlogUser>,IEntityMapper
{
public BlogUserConfiguration()
{
//设置主键
HasKey(m => m.BlogUserId);
}
}

这样我们就可以不用在OnModelCreating中配置,可以把之前的代码删掉,用modelBuilder.Configurations.Add(new BlogUserConfiguration());

这样我们就用了这个通用的接口替换了OnModelCreating方法

在BlogDbContext中的 public DbSet<BlogUser> BlogUser{ get; set; } 可以注释掉,然后直接用DbContext.Set<TEntity>()方法来实现指定实体的属性

如下:

   var dbContext = new BlogDbContext();
IQueryable<BlogUser> blogUser= dbContext.Set<BlogUser>();
blogUser.ToList();

2、Data Annotation验证

所引用程序集:System.ComponentModel.DataAnnotations

Data Annotation主要是在实体类的属性上加入需要验证的条件

例如:aaarticlea/png;base64,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" alt="" />

StringLength表示字符长度限制50位,如果超过此长度则提示"输入过长,不能超过50位";

         [Required(ErrorMessage = "Name is required")]
public string Name { get; set; } [Required(ErrorMessage = "Email is required")]
[RegularExpression(@"^\s*([A-Za-z0-9_-]+(\.\w+)*@([\w-]+\.)+\w{2,3})\s*$", ErrorMessage = "Email is invalid")]
public string Email { get; set; }
Required()表示这个属性是必填的,ErrorMessage的值是必填项没有填时,显示的错误提示信息
RegularExpression()是正则表达式验证,只有符合正则表达式的字符串才能通过验证 Fluent API和Data Annotation配置数据库映射参考博文
http://www.cnblogs.com/oppoic/p/ef_default_mapping_and_data_annotations_fluent_api.html
												

EntityFramework 实体映射到数据库的更多相关文章

  1. ASP.NET Core 中使用EF Core 将实体映射到数据库表的方法(SQL Server)

    前段时间听过一个关于使用ASP.NET Core建立项目的视频.其中使用EF Core映射到数据库的部分是按部就班地学习.今天自己建立项目时,有些步骤已经有一些遗忘.所以写下这篇文章,顺便理清思路. ...

  2. C#------EntityFramework实体加载数据库SQLServer(MySQL)

    一.SQLServer数据库创建表Company,包含ID,CName,IsEnabled三列 二.(1)VS新建一个DXApplication工程,名为CompanyManageSystem (2) ...

  3. 【译】第23节---Fluent API - 实体映射

    原文:http://www.entityframeworktutorial.net/code-first/configure-entity-mappings-using-fluent-api.aspx ...

  4. 追根溯源:EntityFramework 实体的状态变化

    阅读目录: 1. 应用场景 2. 场景测试 3. 问题分析 4. 追根溯源 5. 简要总结 1. 应用场景 首先,应用程序使用 EntityFramework,应用场景中有两个实体 S_Class(班 ...

  5. EF Code First:实体映射,数据迁移,重构(1)

    一.前言 经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也 ...

  6. EF Code First:实体映射

    二.实体映射 实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: (一) DataAnnotation DataAnnotation 特性由.NET 3.5 ...

  7. EF Code First:实体映射,数据迁移,重构

    经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也都依赖于这 ...

  8. EntityFramework 实体拆分和表拆分

    之前有人问过 EF 如何进行实体拆分和表拆分?我记得当时认为不可能,理由忘记了,后来又有人发了一段配置截图,发现原来是可以的,不记录的东西容易忘掉,关于 EF 实体拆分和表拆分,下面是自己的一些整理. ...

  9. 8.2 使用Fluent API进行实体映射【Code-First系列】

    现在,我们来学习怎么使用Fluent API来配置实体. 一.配置默认的数据表Schema Student实体 using System; using System.Collections.Gener ...

随机推荐

  1. 利用excel拆分数据

    要求:将sheet1中的数据按照公司名称拆分到不同的工作表 使用VBA: 1:打开sheet1的查看代码 2:运行 ·········································· ...

  2. iOS 使用Touch ID 校验[新增 iOS9 三种错误]

    iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验.开发者们可使用向第三方应用开放了Touch ID权限的API,以便他们在应用中使用指纹认证来完成用户认证或支付购 ...

  3. mysql 日期格式化

    SELECT plc.id, plc.policy_no, plc.out_date, og.organ_name, ir.insurer_name, pd.product_name, plc.pol ...

  4. My97日期控件 选择日期区间

    <script language="javascript" type="text/javascript" src="My97DatePicker ...

  5. 25、java中观察者模式Observable和Observer

    如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房 ...

  6. USACO2007Monthly Expense月度开销

    Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100 ...

  7. bridge

    1 意图:将抽象部分与实现部分分离,使得它们都可以独立地变化 2 别名:Handle/Body 3 动机:客户在创建窗口时应该不涉及到具体实现部分.仅仅是窗口的实现部分依赖于应用运行的平台. 客户代码 ...

  8. h.APR通道是个怎么回事

    APR通道是Tomcat比较有特色的通道,在早期的JDK的NIO框架不成熟的时候,因为java的网络包的低效,Tomcat使用APR开源项目做网络IO,这样有效的缓解了java语言的不足,提供了一个高 ...

  9. Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式

    由于最近要经常用到XGBOOST的包,不免对相关的GBDT的原理又重新学习了一遍, 发现其中在考虑损失函数的时候,是以对数log进行度量的,囿于误差平方和函数的印象 那么为什么是对数呢?可能是下面的原 ...

  10. Copy List with Random Pointer [LeetCode]

    A linked list is given such that each node contains an additional random pointer which could point t ...