2023年7月13日发(作者:)
EntityFramework(三):使⽤特性(数据注解)创建表结构⼀、理解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定义如下: 1 using System; 2 using c; 3 using ; 4 using ; 5
6 namespace 7 { 8 public class Product 9 {10 public int Id { get; set; }11
12 public string ProductName { get; set; }13
14 public double ProductPrice { get; set; }15 }16 }数据库上下⽂Context类定义如下:using ;using System;using c;using ;using ;using ;namespace ext{ ///
9 namespace 10 {11 ///
21 public int ProductId { get; set; }22
23 ///
28 public string ProductName { get; set; }29
30
31 public double ProductPrice { get; set; }32
33 ///
37 public DateTime ProductionTime { get; set; }38
39 ///
43 public decimal d { get; set; }44 }45 }运⾏程序后⽣成的数据库:修改代码之后,我们将表的名字使⽤Table特性全部重新命名成了但是,将Product的主键通过Column特性更改为Id,Key特性指定它是主键,还通过StringLength指定了ProductName列的最⼤长度为10个字符,最⼩为2个字符。此外,数据注解也可以⽤作验证特性。如果持久化数据时,模型对象的属性值和数据注解所标记的不⼀致,就会抛异常。数据验证相关的数据注解:特性RemoteFileExtensionCompareRegularExpressionCustomValidationDataTypeEmailAddressPhoneCreditCardUrlMemberShipPassword数据映射相关的数据注解:解释使⽤ jQuery 验证插件远程验证程序的特性验证⽂件扩展名⽐较两个属性的值使⽤正则表达式验证⾃定义验证⽅法指定要与数据字段关联的附加类型的名称电⼦邮件地址(相当于DataType())电话(相当于DataType())信⽤卡号码(相当于DataType(Card))验证URL(相当于DataType())验证密码字段是否满⾜成员资格提供程序的当前密码要求特性KeyColumnNotMappedTableForeignKeyDatabaseGeneratedRequiredMaxLengthMinLengthStringLengthRange数据显⽰相关的数据注解:
解释主键字段数据库列属性映射不要创建对应的字段指定类将映射到的数据库表表⽰关系中⽤作外键的属性指定属性应该映射到数据表中计算的列。也可以⽤于映射到⾃动增长的数据库表。指定数据库⽣成属性值的⽅式(EF不追踪属性的变化)必填字段指定属性中允许的数组或字符串数据的最⼤长度指定属性中允许的数组或字符串数据的最⼩长度指定最⼩和最⼤字符长度指定数值范围
特性DisplayNameDisplayDisplayFormatReadOnlyEditAbleHiddenInputScaffoldColumnUIHint其他:解释指定本地化的字符串(习惯⽤语类)指定本地化的字符串(习惯⽤语属性)设置数据字段的格式指定该特性所绑定到的属性是只读属性还是读/写属性指⽰数据字段是否可编辑指⽰是否应将属性值或字段值呈现为隐藏的 input 元素指定类或数据列是否使⽤基架指定动态数据⽤来显⽰数据字段的模板特性DisplayColumnDescription解释将所引⽤的表中显⽰的列指定为外键列可视化设计器在引⽤组件成员时可以显⽰指定的说明(命名空间:ptionAttribute)
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689248335a225694.html
评论列表(0条)