iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >EF使用数据注解特性创建表结构
  • 466
分享到

EF使用数据注解特性创建表结构

2024-04-02 19:04:59 466人浏览 安东尼
摘要

一、理解Code First及其约定和配置   传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序。这种方法非常适合于数

一、理解Code First及其约定和配置

  传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序。这种方法非常适合于数据密集的应用或者数据库很可能包含多个应用使用的业务逻辑的应用。对于这种应用,如果要使用EF的话,我们必须使用Database First方式。
  设计应用的另一种方法就是以领域为中心的方式(领域驱动设计DDD)。DDD是一种由上而下的方式,我们通过从实现应用所需要的领域模型和实体的角度思考,从而开始设计应用。数据库很少用来用于领域模型数据的持久化。使用DDD意味着我们要根据每个应用的需求来设计模型和实体,而且模型和实体是数据库可忽略的,即可以使用任何数据库技术实现保存。在这些情景中,我们应该使用EF的Code First方式,因为它允许我们创建POCO(Plain Old CLR Objects)作为持久化可忽略的领域模型。
使用Code First的优势在于:

  • 1、支持DDD。
  • 2、可以早早地着手开发,因为我们不必等待数据库的创建。
  • 3、持久化层(底层的数据库)的改变不会对现有的模型有任何影响。

  我们需要搞清楚的第一件事就是约定大于配置的概念。Code First方式期望模型类遵守一些约定,这样的话数据库持久化逻辑就可以从模型中提取出来。比如,如果我们给一个模型定义了一个Id属性,那么它就会映射到数据库中该类所对应的那张表的主键。这种基于约定的方式的好处在于:如果我们遵守了这些约定,那么我们就不必写额外的代码来管理数据库持久逻辑。但这样也存在缺点,缺点在于:如果没有遵守某个约定,那么EF就不会从模型中提取到需要的信息,运行时会抛异常。
  在这种没有遵守约定又要持久化数据的情况下,我们需要使用Code First的配置项提供关于模型一些额外的信息。比如,如果我们的模型类中没有Id属性作为主键,那么我们需要在想要的属性上加上[Key]特性,这样它就会被当作主键了。
注意:

EF使用模型类的复数的约定来创建数据表名,创建的列名和该类的属性名是一样的。

示例:

使用在EF应用一:Code First模式中介绍的使用方法创建一个数据库,其中实体类Product定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EFAppointmentCreateTable.Model
{
    public class Product
    {
        public int Id { get; set; }

        public string ProductName { get; set; }

        public double ProductPrice { get; set; }
    }
}

数据库上下文Context类定义如下:

using EFAppointmentCreateTable.Model;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;

namespace EFAppointmentCreateTable.EFContext
{
    /// <summary>
    /// 定义数据库上下文类,该类继承自DbContext
    /// </summary>
    public class Context:DbContext
    {
        /// <summary>
        /// 定义构造函数,继承自父类的构造函数,通过继承父类的构造函数来创建数据库
        /// 父类构造函数的参数是配置文件中配置的数据库连接字符串
        /// </summary>
        public Context()
            : base("DbConnection")
        { }

         //实体属性集合  根据实体名称的复数形式生成数据库的表名
        // 生成的表名是Products 和属性名Products无关
        // 即使把属性名改成Product,生成的表名还是Products 约定大于配置
        public DbSet<Product> Products { get; set; }
    }
}

创建后的数据库截图如下:

从上面的截图中可以看出,生成的数据库表名是实体Product的复数形式,使用默认约定生成Id主键列。

二、使用数据注解创建表结构

1、.net数据类型和sql数据类型之间的映射

首先EF这个ORM工具就是用来解决.NET类型和SQL Server列类型之间的阻抗失配的问题。比如,假设你在.net中定义了一个int类型的属性,那么你就可以认为EF已经安全地处理了这个列的定义并使用了合适的类型与之对应。记住一些.NET类型和SQL Server列类型之间的映射是很有必要的,下面是一些最常用的映射关系:

SQL Server Database Type.NET Type
BigintInt64
binary,varbinaryByte[]
BitBoolean
date,datetime,
datetime2,smalldatetime
DateTime
DatetimeoffsetDateTimeOffset
decimal,money
smallmoney,numeric
Decimal
floatDouble
intInt32
nchar nvarchar,char
varchar
String
realSingle
rowversion,timestampByte[]
smallintInt16
timeTimeSpan
tinyintByte
uniqueidentifierGuid

完整的映射列表可以参考SQL Server数据类型映射,如果你使用的是其他类型的数据库,你可以在网上自行查找。比如,,如果是oracle,那么你可以在这里查找:oracle数据类型映射。

2、配置原始属性

以.NET中的string类型的属性开始讨论。SQL Server中的很多类型都会映射到.NET中的string类型,其他主流的RDBMS也是一样的。因此,决定如何存储字符串类型的信息是很重要的,很多关系数据库管理引擎都有多个字符存储类型,他们通常都有以字母N打头的字符类型,这个字母表示要存在这些列中的数据是Unicode数据,基于每个字符以2个字节的格式存储。因此,如果你的数据库中的列存储的是英文的话,就可以使用varchar或者char(可能会加速查询),如果使用的是中文的话,就要使用nvarchar或者nchar。此外,还可以使用带有var的字符类型来指定列的长度是可变的,不使用var的话,字符长度是不可变的。
在EF中有以下几种配置数据库结构的方式,分别是:

  • 1、特性,也叫数据注解。
  • 2、DbModelBuilder api
  • 3、配置伙伴类。

3、特性(数据注解)

这些特性类都是.NET的一部分,位于System.ComponentModel.DataAnnotaions命名空间下。下面我们修改在上一个例子中使用的Product实体类,修改后的Product实体类如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFDataAnnotations.Model
{
    /// <summary>
    /// 使用Table特性指定生成的表名
    /// </summary>
    [Table("Product")]
    public class Product
    {
        //使用Key特性指示该列是主键列
        [Key]
        //使用Column特性指示生成的数据库表中的列名
        [Column("ID")]
        public int ProductId { get; set; }

        /// <summary>
        /// StringLength设置数据库表中列的长度
        /// 指示ProductName字段的最大长度是10,最小长度是2
        /// </summary>
        [StringLength(10,MinimumLength=2)]
        public string ProductName { get; set; }


        public double ProductPrice { get; set; }

        /// <summary>
        /// DataType特性指示生成的数据库表中列的数据类型
        /// </summary>
        [DataType(DataType.DateTime)]
        public DateTime ProductionTime { get; set; }

        /// <summary>
        /// NotMapped特性指示不把该属性映射到数据库表中,即在生成的表中没有d这一列
        /// </summary>
        [NotMapped]
        public decimal d { get; set; }
    }
}

运行程序后生成的数据库:

修改代码之后,我们将表的名字使用Table特性全部重新命名成了但是,将Product的主键通过Column特性更改为Id,Key特性指定它是主键,还通过StringLength指定了ProductName列的最大长度为10个字符,最小为2个字符。

此外,数据注解也可以用作验证特性。如果持久化数据时,模型对象的属性值和数据注解所标记的不一致,就会抛异常。

数据验证相关的数据注解:

特性解释
Remote使用 Jquery 验证插件远程验证程序的特性
FileExtension验证文件扩展名
Compare比较两个属性的值
RegularExpression使用正则表达式验证
CustomValidation自定义验证方法
DataType指定要与数据字段关联的附加类型的名称
EmailAddress电子邮件地址(相当于DataType(DataType.Email))
Phone电话(相当于DataType(DataType.Phone))
CreditCard信用卡号码(相当于DataType(DataType.CreditCard))
Url验证URL(相当于DataType(DataType.Url))
MemberShipPassWord验证密码字段是否满足成员资格提供程序的当前密码要求

数据映射相关的数据注解:

特性解释
Key主键字段
Column数据库列属性映射
NotMapped不要创建对应的字段
Table指定类将映射到的数据库表
ForeignKey表示关系中用作外键的属性
DatabaseGenerated

指定属性应该映射到数据表中计算的列。也可以用于映射到自动增长的数据库表。

指定数据库生成属性值的方式(EF不追踪属性的变化)
Required必填字段
MaxLength指定属性中允许的数组或字符串数据的最大长度
MinLength指定属性中允许的数组或字符串数据的最小长度
StringLength指定最小和最大字符长度
Range指定数值范围 

数据显示相关的数据注解: 

特性解释
DisplayName指定本地化的字符串(习惯用语类)
Display指定本地化的字符串(习惯用语属性)
DisplayFormat设置数据字段的格式
ReadOnly指定该特性所绑定到的属性是只读属性还是读/写属性
EditAble指示数据字段是否可编辑
HiddenInput指示是否应将属性值或字段值呈现为隐藏的 input 元素
ScaffoldColumn指定类或数据列是否使用基架
UIHint指定动态数据用来显示数据字段的模板

其他:

特性解释
DisplayColumn将所引用的表中显示的列指定为外键列
Description可视化设计器在引用组件成员时可以显示指定的说明
(命名空间:System.ComponentModel.DescriptionAttribute)

到此这篇关于EF使用数据注解特性创建表结构的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: EF使用数据注解特性创建表结构

本文链接: https://www.lsjlt.com/news/141163.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • EF使用数据注解特性创建表结构
    一、理解Code First及其约定和配置   传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序。这种方法非常适合于数...
    99+
    2024-04-02
  • EntityFramework使用DbModelBuilderAPI创建表结构
    DbContext类有一个OnModelCreating方法,它用于流利地配置领域类到数据库模式的映射。下面我们以fluent API的方式来定义映射。首先,先将Product类注释...
    99+
    2024-04-02
  • 创建高性能链表结构,使用Golang编写
    Golang是一门高性能的编程语言,它的并发能力和内存管理使得它非常适合编写高效的数据结构。链表是一种常见的数据结构,下面将介绍如何使用Golang编写高效的链表结构,并提供具体的代码示例。 链表是一种线性数...
    99+
    2024-01-29
    Golang 高效 链表
  • JavaScript 数据结构之散列表的创建(2)
    目录一、处理散列值冲突1.分离链接2.put 方法3.get 方法前言: 上一篇我们介绍了什么是散列表,并且用通俗的语言解析了散列表的存储结构,最后动手实现了一个散列表,相...
    99+
    2024-04-02
  • JavaScript数据结构之散列表怎么创建
    本文小编为大家详细介绍“JavaScript数据结构之散列表怎么创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript数据结构之散列表怎么创建”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、处...
    99+
    2023-06-30
  • JavaScript 数据结构之散列表的创建(1)
    目录一、什么是散列表二、创建散列表1.创建散列函数2.put 方法3.get 方法4.delete 方法三、使用散列表四、总结上一篇我们一篇JavaScript 数据结构之...
    99+
    2024-04-02
  • HTML 表格标签入门:使用表格构建结构化数据
    表格基本语法 创建一个表格需要使用标签: <table> ... </table> 每一行都使用标签: <tr> ... </tr> 每一列都使用标签: <td> ....
    99+
    2024-04-02
  • 数据库的建筑师:使用 DDL 构建数据结构
    数据库中的数据结构是数据的骨架,它定义了数据的存储方式、组织形式和访问权限。使用数据定义语言 (DDL) 构建数据结构是数据库管理系统 (DBMS) 中的一项基本任务。本文将详细介绍 DDL 中用于创建、修改和删除数据结构的常用命令。 ...
    99+
    2024-02-19
    数据定义语言 DDL CREATE ALTER DROP 数据建模 数据结构
  • Entity Framework中怎么使用DbModelBuilder API创建表结构
    这篇文章主要讲解了“Entity Framework中怎么使用DbModelBuilder API创建表结构”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Entity&n...
    99+
    2023-06-29
  • C语言数据结构创建及遍历十字链表
    目录一、十字链表是什么?二、十字链表的存储结构三、代码实现 1.引入头文件并定义结构体2.建立十字链表3.遍历十字链表4.调用函数本文需要读者有一定的代码基础,了解指针,链...
    99+
    2024-04-02
  • 使用SQL语句创建数据库与创建表
    前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个...
    99+
    2023-09-29
    数据库 sql
  • 数据结构的编织者:使用 DDL 创建定制的数据布局
    数据结构是数据库中组织和存储数据的基础。它们定义了数据字段、数据类型和关系,以创建支持业务需求的高效数据布局。数据定义语言 (DDL) 是用于创建、修改和删除数据库对象的 SQL 子集,它提供了构建定制数据结构的强大工具。 DDL 操作...
    99+
    2024-02-19
    数据结构 数据定义语言 (DDL) 关系数据库 表设计 字段类型
  • C语言数据结构中的线性表怎么使用
    这篇文章主要介绍“C语言数据结构中的线性表怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言数据结构中的线性表怎么使用”文章能帮助大家解决问题。一、分文件编写1、分文件编写概念在Visua...
    99+
    2023-06-30
  • C语言数据结构之二叉链表创建二叉树
    目录一、思想(先序思想创建)二、创建二叉树(1)传一级参数方法(2)传二级参数方法一、思想(先序思想创建) 第一步先创建根节点,然后创建根节点左子树,开始递归创建左子树,直到递归创建...
    99+
    2024-04-02
  • Java数据结构顺序表用法详解
    目录1.什么是顺序表2.顺序表的基本功能和结构3.顺序表基本功能的实现和解析1.判断线性表是否为空2.获取指定位置的元素3.向线性表表添加元素4.在位置i处插入元素5.删除指定位置的...
    99+
    2024-04-02
  • 使用 HTML 定义列表创建结构化内容的艺术
    HTML 定义列表 (dl) 标签用于在网页中创建结构化的数据列表。它可以将数据项分组并添加描述,从而使数据更易于阅读和理解。 定义列表由一系列定义项 (dt) 和定义描述 (dd) 组成。定义项是数据项的名称或标题,而定义描述是数据项...
    99+
    2024-02-07
    HTML 定义列表 标签 结构化内容 数据列表 语义化
  • 如何理解C语言数据结构中线性表的链式存储结构
    如何理解C语言数据结构中线性表的链式存储结构,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.什么是线性表的链式存储结构 —链表存储结点:包括元素本身的信息,还有元素之间的关系...
    99+
    2023-06-21
  • C语言数据结构线性表教程示例详解
    目录线性表顺序表线性表 数据结构里我们时常看到什么什么表,线性表是最基本、最简单、也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义: 一个线性表是n...
    99+
    2024-04-02
  • Android Studio 使用SQLite数据库来创建数据库+创建数据库表+更新表再次往表添加字段
    目录 一.前言 二.SQLite数据库介绍 1.什么是SQLite数据库 2.特点 3.SQLite 操作API 4.SQLite数据类型 三.SQlite数据库的使用 1.创建类继承SQLiteOPenHelper 2.创建数据库 3.创...
    99+
    2023-09-25
    数据库 sqlite android android studio ide java
  • c++ 数据结构map的使用详解
    目录map的常用用法 1. 头文件2. 定义 3. map 容器内元素的访问 (1)通过下标访问 (2)通过迭代器访问 (3)通过逆向迭代器访问4. map 元素的插入 5. map...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作