ASP.NET Core使用EF创建模型

目录
  • 1.什么是Fluent API?
  • 2.包含属性和排除属性
    • 2.1包含属性
    • 2.2排除属性
      • 2.2.1数据批注
      • 2.2.2Fluent API
  • 3.主键
    • 3.1数据批注
    • 3.2Fluent API
  • 4.生成值
    • 4.1数据批注
      • 4.1.1无值生成
      • 4.1.2在添加时生成值
      • 4.1.3在添加或更新时生成值
    • 4.2Fluent API
      • 4.2.1无值生成
      • 4.2.2在添加时生成值
      • 4.2.3在添加或更新时生成值

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()) > 1) 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();

到此这篇关于ASP.NET Core使用EF创建模型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解EFCore中的导航属性

    使用了这么久的EntityFrameworkCore框架,今天想来就其中的一个部分来做一个知识的梳理,从而使自己对于整个知识有一个更加深入的理解,如果你对EFCore中的实体关系不熟悉你需要有一个知识的预热,这样你才能够更好的去理解整个知识,在建立好了这些实体之间的关系以后,我们可以通过使用InClude.ThenInclude这些方法来进行快速获得对应关联实体数据,用起来确实十分的方便,这里我们将通过一系列的例子来进行说明.    1 单独使用Include 在介绍这个方法之前,我来先贴出实体

  • ASP.NET Core基于现有数据库创建EF模型

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序,对现有数据库进行反向工程以便创建Entity Framework模型. 2.创建数据库 我们可以通过Visual Studio创建一个数据库再进行演示,步骤如下:●打开Visual Studio开发工具●“工具”>“连接到数据库”●选择“Microsoft SQL Ser

  • .NET Core使用EF生成数据库出错的解决方法

    在.NET Core 项目钟(类库),使用Entity Framework,建立模型生成数据库时,失败 Could not load assembly 'xxx'. Ensure it is referenced by the startup project 'xxx'. 改成 64 位即可 假设 ef 代码 public class ApplicationDbContext : IdentityDbContext<User> { public ApplicationDbContext(DbC

  • .net EF Core专题:EF Core 读取数据时发生了什么?

    原文:https://bit.ly/2UMiDLb 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知道如何组织但又不影响理解的句子. 本文将为你详细描绘 EF Core 从数据库中读取数据的"幕后"视图.我将揭开两种数据库读取方式的面纱:一个是普通的查询,另一个是使用 AsNoTracking 方法的非跟踪查询.我还将通过一个实验来演示我是如何解决我的一个客户遇到的性能问题. 我假设你对 EF C

  • C# EF Core可视化工具的使用及EF Core入门语句操作代码

    目录 前言 一.EFCoreTools的下载 二.EFCoreTools的使用 1.新建项目并引入EFCoreTools 2.手动引入EFCore的包 三.EFCore的填查删改 1.添加操作 2.查找操作 3.删除操作 4.修改操作 四.总结 前言 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术. 一.EF Core Tools的下载 EFCore Tools可视化工具下载后安装,并重启ViusalS

  • ASP.Net Core基于EF6、Unitwork、Autofac实现Repository模式

    一.实现的思路和结构图 Repository的共同性 有一些公共的方法(增删改查), 这些方法无关于Repository操作的是哪个实体类,可以把这些方法定义成接口IRepository,然后有个基类BaseRepository实现该接口的方法.常见的方法,比如Find, Filter, Delete, Create等 Repository的差异性 每个Repository类又会有一些差异性,应当允许它们能够继承BaseRepository之外,还能够再扩展自己的一些方法.所以每个类都可以再定义

  • .net core EF Core调用存储过程的方式

    前言 在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.FromSql,官方文档 DbSet<TEntity>.FromSql() 2.执行SQl命令 DbContext.Database.ExecuteSqlCommand() 但是,这两种方式都有局限性: 1.FromSql方式的结果一定要是实体类型,就是数据库表映射的模型.这意味着,执行存储过

  • 使用ef6创建oracle数据库的实体模型遇到的问题及解决方案

    解决方案中的数据层项目最初使用的是oracle 11g + ef5 创建的实体模型,在分页时遇到了skip参数为0报错的问题,没有找到相关资料. 于是决定升级到ef6,在oracle官网中得知,Oracle Data Provider for .NET in ODAC 12c Release 3 开始支持ef6(https://docs.oracle.com/cd/E56485_01/win.121/e55744/release_changes.htm#CIHGIAEG) 安装步骤: 1.安装o

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

    目录 1.必需和可选属性 1.1约定 1.2数据批注 1.3Fluent API 2.最大长度 2.1约定 2.2数据批注 2.3Fluent API 3.并发标记 3.1约定 3.2数据注释 3.3Fluent API 4.时间戳/行版本 4.1约定 4.2数据注释 4.3Fluent API 5.阴影属性 5.1约定 5.2数据注释 5.3Fluent API 1.必需和可选属性 如果实体属性可以包含null,则将其视为可选.如果属性的有效值不可以包含null,则将其视为必需属性.映射到关系

  • ASP.NET Core使用EF创建模型

    目录 1.什么是Fluent API? 2.包含属性和排除属性 2.1包含属性 2.2排除属性 2.2.1数据批注 2.2.2Fluent API 3.主键 3.1数据批注 3.2Fluent API 4.生成值 4.1数据批注 4.1.1无值生成 4.1.2在添加时生成值 4.1.3在添加或更新时生成值 4.2Fluent API 4.2.1无值生成 4.2.2在添加时生成值 4.2.3在添加或更新时生成值 1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无

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

    目录 1.索引 1.1约定 1.2数据批注 1.3Fluent API 2.备用键 2.1约定 2.2数据注释 2.3Fluent API 3.继承 3.1约定 4.支持字段 4.1约定 4.2数据注释 4.3Fluent API 4.3.1控制何时使用字段 4.3.2没有属性的字段 1.索引 索引是跨多个数据存储区的常见概念.尽管它们在数据存储中的实现可能会有所不同,但也可用于基于列(或一组列)更高效地进行查找. 1.1约定 按照约定,将在用作外键的每个属性(或一组属性)中创建索引. 1.2数

  • ASP.NET Core使用EF创建模型(包含属性、排除属性、主键和生成值)

    目录 1.什么是Fluent API? 2.包含属性和排除属性 2.1包含属性 2.2排除属性 2.2.1数据批注 2.2.2Fluent API 3.主键 3.1数据批注 3.2Fluent API 4.生成值 4.1数据批注 4.1.1无值生成 4.1.2在添加时生成值 4.1.3在添加或更新时生成值 4.2Fluent API 4.2.1无值生成 4.2.2在添加时生成值 4.2.3在添加或更新时生成值 1.什么是Fluent API? EF中内嵌的约定将POCO类映射到表.但是,有时您无

  • ASP.NET Core使用EF创建关系模型

    目录 1.关系 2.术语定义 3.约定 4.完全定义的关系 5.无外键属性 6.单个导航属性 7.数据注释 7.1ForeignKey 7.2InverseProperty 8.Fluent API 8.1单个导航属性 8.2ForeignKey 8.3无导航属性 9.主体密钥 10.必需和可选的关系 11.级联删除 12.其他关系模式 12.1一对一 12.1.1数据注释 12.1.2Fluent API 12.2多对多 1.关系 关系定义两个实体之间的关系.在关系型数据库中,这由外键约束表示

  • ASP.NET Core使用EF SQLite对数据库增删改查

    SQLIte 操作方便,简单小巧,这里笔者就不再过多介绍,感兴趣可以到以下博文 https://www.jb51.net/article/234142.htm 文章介绍创建ASP.NET Core 程序,创建模型.上下文,生成数据库,对数据库增删查改. 并对每个过程进行详细介绍,使初学者尽快了解内容和相关知识,避免对某一知识点怀疑.卡在某个位置. 1 新建ASP.NET Core MVC 应用 1.1 新建MVC应用 打开Visual Studio 2017,新建 ASP.NET Web应用程序

  • ASP.NET Core使用EF保存数据、级联删除和事务使用

    目录 1.简介 2.基本保存 2.1添加数据 2.2更新数据 2.3删除数据 2.4单个SaveChanges中的多个操作 3.保存关联数据 3.1添加关联数据 3.2添加相关实体 3.3更改关系 4.级联删除 5.事务 5.1控制事务 1.简介 每个上下文实例都有一个ChangeTracker,它负责跟踪需要写入数据库的更改.更改实体类的实例时,这些更改会记录在ChangeTracker中,然后在调用SaveChanges时会被写入数据库中.此数据库提供程序负责将更改转换为特定于数据库的操作(

  • ASP.NET Core 6.0 基于模型验证的数据验证功能

    目录 1 前言 1.1 数据验证的场景 1.2 本文的脉络 2 模型验证 2.1 介绍 2.2 基本使用 (1)自定义模型 (2)控制器代码 (3)测试 2.3 内置特性 3 自定义数据验证 3.1 介绍 3.2 前置准备 3.3 方案1:替换工厂 3.4 方案2:自定义过滤器 (1)自定义过滤器 (2)禁用默认过滤器 (3)启用自定义过滤器 3.5 测试 3.6 总结 4 源码解读 4.1 基本介绍 4.2 MvcServiceCollectionExtensions 4.3 ApiBehav

  • ASP.NET Core MVC中的模型(Model)

    目录 1.模型绑定 2.使用模型绑定 3.通过特性自定义模型绑定行为 4.从请求主体绑定格式化的数据 5.模型验证 6.自定义验证 7.客户端验证 8.远程验证 1.模型绑定 ASP.NET Core MVC 中的模型绑定将数据从HTTP请求映射到操作方法参数.参数既可以是简单类型,也可以是复杂类型.MVC 通过抽象绑定解决了这个问题. 2.使用模型绑定 当 MVC 收到一个HTTP 请求时,它会将其路由到一个控制器指定的操作方法.它基于路由数据来决定运行哪个操作,然后将值从HTTP请求绑定到操

  • ASP.NET Core使用EF查询数据

    1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成给数据库可识别数据形式). 发送的查询结果(查询表示形式)会被缓存,以便每次执行查询时无需进行1.1中处理. 1.2查询结果(查询表示形式)会传递到数据库提供程序 数据库提供程序会识别出查询的哪些部分可以在数据库中求值. 查询的这些部分会转换为特定数据库的查询语言(例如,关系数据库的T-SQL).

随机推荐