1.什么是Fluent API?

EF中内嵌的约定将POCO类映射到表。但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方法,这两种方法是用来配置EF在映射属性时绕开约定。Code first fluent API最常访问通过重写OnModelCreating方法在派生DbContext。

2.包含属性和排除属性

按照约定,数据模型中都包含一个getter和一个setter公共属性。

2.1包含属性

包含属性官网解释有点难以理解,我个人认为在OnModelCreating方法配置包含Blog模型,那么当我们调用Blog模型读写数据时候就会从连接数据库中读写对应Blog表。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Blog>();
}

2.2排除属性

如果你不想往BlogMetadata上读写数据,可以使用数据批注或者fluent API从模型中排除该实体类型。

2.2.1数据批注
namespace EFModeling.DataAnnotations.IgnoreType
{
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogMetadata Metadata { get; set; }
}
 //读写不映射该实体
[NotMapped]
public class BlogMetadata
{
public DateTime LoadedFromDatabase { get; set; }
}
}
2.2.2Fluent API
namespace EFModeling.FluentAPI.IgnoreType
{
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Ignore方法就是读写不映射该实体
        modelBuilder.Ignore<BlogMetadata>();
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogMetadata Metadata { get; set; }
}
public class BlogMetadata
{
public DateTime LoadedFromDatabase { get; set; }
}
}

3.主键

使用关系型数据库时候,都会涉及到主键概念,用作每个实体实例的主要唯一标识符。

3.1数据批注

namespace EFModeling.DataAnnotations.KeySingle
{
class MyContext : DbContext
{
public DbSet<Car> Cars { get; set; }
}
class Car
{
   //设置LicensePlate为主键
[Key]
public string LicensePlate { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
}

3.2Fluent API

namespace EFModeling.FluentAPI.KeySingle
{
class MyContext : DbContext
{
public DbSet<Car> Cars { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
          //设置LicensePlate为主键
.HasKey(c => c.LicensePlate);
}
}
class Car
{
public string LicensePlate { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
}

4.生成值

有三个可用于属性的值生成模式:
●无值生成:没有值生成意味着,需始终提供要保存到数据库的有效值。必须先将有效的值赋予新的实体,再将这些新的实体添加到上下文中。
●在添加时生成值:在添加时生成值,意思是为新实体生成值。
●在添加或更新时生成值:在添加或更新时生成值,意味着在每次保存该记录(插入或更新)时生成新值。
注:如果想在数据库端添加或更新时自动生成值,我们可以通过触发器和配置默认值等方法生成。例如,如果指定在添加或更新时要生成DateTime属性,则必须设置生成值的方法。若要执行此操作,一种方法是配置GETDATE() 的默认值以生成新行的值,然后即可使用数据库触发器在更新过程中生成值,如下面的示例触发器所示:

USE [Blogging]
GO
/****** Object: Trigger [dbo].[Blog_Update_Trigger] Script Date: 2019/10/22 16:18:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Blog_Update_Trigger] ON [dbo].[Blog]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF ((SELECT TRIGGER_NESTLEVEL()) > ) RETURN;
DECLARE @Id INT SELECT @Id = INSERTED.BlogId
FROM INSERTED UPDATE dbo.Blog
SET Updatetime = GETDATE()
WHERE BlogId = @Id
END

4.1数据批注

4.1.1无值生成
public class Blog
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int BlogId { get; set; }
public string Url { get; set; }
}
4.1.2在添加时生成值
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Inserted { get; set; }
}
4.1.3在添加或更新时生成值
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdated { get; set; }
}

4.2Fluent API

4.2.1无值生成
modelBuilder.Entity<Blog>()
.Property(b => b.BlogId)
.ValueGeneratedNever();
4.2.2在添加时生成值
modelBuilder.Entity<Blog>()
.Property(b => b.Inserted)
.ValueGeneratedOnAdd();
4.2.3在添加或更新时生成值
modelBuilder.Entity<Blog>()
.Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate();

参考文献:
包含属性和排除属性
主键
生成的值

(19)ASP.NET Core EF创建模型(包含属性和排除属性、主键、生成的值)的更多相关文章

  1. (22)ASP.NET Core EF创建模型(索引、备用键、继承、支持字段)

    1.索引 索引是跨多个数据存储区的常见概念.尽管它们在数据存储中的实现可能会有所不同,但也可用于基于列(或一组列)更高效地进行查找. 1.1约定 按照约定,将在用作外键的每个属性(或一组属性)中创建索 ...

  2. (20)ASP.NET Core EF创建模型(必需属性和可选属性、最大长度、并发标记、阴影属性)

    1.必需和可选属性 如果实体属性可以包含null,则将其视为可选.如果属性的有效值不可以包含null,则将其视为必需属性.映射到关系数据库架构时,必需的属性将创建为不可为null的列,而可选属性则创建 ...

  3. (21)ASP.NET Core EF创建模型(关系)

    1.关系 关系定义两个实体之间的关系.在关系型数据库中,这由外键约束表示. 2.术语定义 有许多术语用于描述关系:●相关实体:这是包含外键属性的实体.有时称为关系的"子级".●主体 ...

  4. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  5. asp.net core+ef core

    asp.net core+ef core 官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一 ...

  6. 使用 ASP.NET Core MVC 创建 Web API——响应数据的内容协商(七)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  7. 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】

    Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...

  8. 使用 ASP.NET Core MVC 创建 Web API(四)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  9. 使用 ASP.NET Core MVC 创建 Web API(六)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

随机推荐

  1. Winform中使用printDocument控件打印pictureBox中的二维码照片

    场景 Winform中使用zxing和Graphics实现自定义绘制二维码布局: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  2. hive 元数据解析

    在使用Hive进行开发时,我们往往需要获得一个已存在hive表的建表语句(DDL),然而hive本身并没有提供这样一个工具. 要想还原建表DDL就必须从元数据入手,我们知道,hive的元数据并不存放在 ...

  3. Elastic Stack 笔记(五)Elasticsearch5.6 Mappings 映射

    博客地址:http://www.moonxy.com 一.前言 关系型数据库对我们来说都很熟悉,Elasticsearch 也可以看成是一种数据库,所以我们经常将关系型数据库中的概念和 Elastic ...

  4. Phpstudy被暴存在隐藏后门-检查方法

    Phpstudy被暴存在隐藏后门-检查方法 一.事件背景 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOp ...

  5. 是的,是你的BFC - CSS中常用

    是的,是你的BFC - CSS中常用     是的,是你的BFC - CSS中常用 CFC 全称:(Block Formatting Contexts)含义是块级格式化上下文),就是一个块级元素的渲染 ...

  6. .netCore+Vue 搭建的简捷开发框架 (2)--仓储层实现和EFCore 的使用

    书接上文,继续搭建我们基于.netCore 的开发框架.首先是我们的项目分层结构. 这个分层结构,是参考张老师的分层结构,但是实际项目中,我没有去实现仓储模型.因为我使用的是EFCore ,最近也一直 ...

  7. Android的有序广播和无序广播(解决安卓8.0版本之后有序广播的接收问题)

    前言 Google从Android8.0版本开始,对在清单文件中静态注册广播做了限制. *** 特殊广播(动态注册广播接收者) 说:有序广播和无序广播之前,咱们先来说下Android中一些特殊的广播如 ...

  8. 为什么需要OLAP DSL?

    OLAP(On-Line Analytical Processing,联机分析处理)是大数据场景中,数据价值探索与挖掘的重要环节.这个领域内,开源社区呈现百花齐放的现象,Elasticsearch.D ...

  9. el-table合并行并自定义某一列或几列

    在el-table的官方组件中并没有看到具体的合并行或者列及自定义表格内容,于是就自己写了一个效果如下所示. 这种对左侧内容要求比较高,要求行合并,并要自定义一些内容.下面说一下具体方法及代码写法. ...

  10. PHPstorm出现的端口号错误问题(502)

    咔咔咔-听好 PhpStorm的默认端口是63342,但是在浏览器会提示502错误. 同时Phpstorm右下角会报错:Please ensure that configured PHP Interp ...