使用Entity. Framework编程(2)(2)
字符串属性的约定
字符串约定为映射到不限长度的非空列中。由数据库引擎来负责确定映射到何种类型。对于SQL Server而言,默认数据类型为nvarchar(max)。这就是你在图2-1看到的所有的字符串属性都映射成了nvarchar(max)列的缘故,Country,Description等等.--同时还允许存储空值;
针对Byte数组的约定
Destination类有一个Photo属性,定义为byte[].Code First 约定byte数组映射到不限长度的非空列中.对SQL Server而言就是varbinary(max)类型.
布尔值的约定
Lodging类中的IsResort属性是一个bool类型.由于bool是一个值类型,不能分配给其一个null值.Code First强制要求此列不能为空.对SQL Server而言将bool属性映射为bit 数的库类型.
一对多关系的约定
一个目的地会有很多居所,因此Destination类有一个List<Lodging>属性允许你获取特定目的地的所有居所信息.同时,Lodging类也有一个Destination类型的属性,,因此你可看到某一居所与某一特定的目的地相连接.Code First将这种情况视为一对多关系,约定Lodging表有一个外键约束目的地与居所间的所有关系.
注意尽管在Lodging类中没有外键属性指向Destination类(如DestinationId),Code First仍然使用默认规则创建了一个,形如[Name of navigation property]_[Primary Key of related class](即Destination_DestinationId),这是Code First所为。使得EF框架知道在从数据库中查询或保存时要使用外键.
在目的地和住宿类提供给Code First的导航属性不是一个,而是两个。如果我们只提供了其中之一,关系仍然明显,Code First还是会在数据库中创建外键。还有很多提供外键的约定适用于某些场景,如多对多关系等,在后面我们会深入讨论。
使用配置来覆写约定
正如在第1章学到的,Code First允许你覆写约定,方法是添加配置.可以选择使用Data Annotation的特性标记也可以使用强类型的Fluent API来配置.
您提供的任何配置将会作为模型的一部分,EF框架使用此模型在运行时解析数据。这不仅影响数据库构架,也会影响DbContext内置的验证功能。例如,如果你告诉Code First一个属性是必备的,验证API将让你知道,如果该属性没有被填充的后果。在后续我们将看到这一行为。 Data Annotations是最简单的配置方式,直接应用到你的类和类属性上。这些特性位于ponentModel.DataAnnotations命名空间,目前分布在
ponentModel.DataAnnotations.dll和EntityFramework.dll两个程序集中。
在未来版本的.NET Framework中,EntityFramework.dll中的Annotations将迁移到ponentModel.DataAnnotations.dll。所以需要在域类的项目中引用上述程序集(取决于您使用的Annotations)。注意Data Annotations能够完成常用的配置,但并非所有Code First配置都可以使用Data Annotation来完成。一些情况下只能使用另一种风格的配置方式:Fluent API。 因为Code First没有自动发现Destination和Lodging类中的某些意图,需要用一些Data Annotations提供额外的配置细节。
小贴士:在C#和Visual Basic应用特性
如果你第一次使用特性,在C#中,特性应使用方括号。例如,使用Annotation 特性Key,在c#中使用[Key],而在Visual Basic中,使用尖括号(<Key>)。当一个特性使用参数时,在C#中是表达了一个等号表达([Table(Schema="baga")]),而Visual Basic使用冒号等号表示(<Table(Schema:="baga")>) 要知道.NET代码中使用特性的更多信息,请参阅MSDN主题"应用特性",在/en-us/library/bfz783fz.aspx。 让我们从Destination类开始.关于这个类我想要作三个调整:
必须提供目的地的名字
限制描述字段的文本内容在500个字符以内
保存照片到SQL Server数据库应为image类型,
而不是varbinary(max).
上述需要的Data Annotations特性有两个包含在
ponentModel.DataAnnotations.dll程序集中,这是.Net 4的一部分,有一个包含在EntityFramework.dll程序集里,所以需要对两个程序集都要添加引用:
1.在Model项目中,添加对ponentModel.DataAnnotations 程序集的引用.
2.通过类库包装引用添加对EntityFramework程序集的引用.
记住:你必须对每个项目都运行NuGet类库添加向导,即使类库包已经添加到解决方案中的某个项目中.使用同样的步骤将EntityFramework.dll添加到DataAccess项目中.
3.在Destination类顶部,添加ponentModel.DataAnnotations命名空间.
4.修改类如代码2-8所示Example 2-8. Modified Destination class
using System.Collections.Generic;
using ponentModel.DataAnnotations;
namespace Model
{
public class Destination
{
public int DestinationId { get; set; } [Required] public string Name { get; set; } public string Country { get; set; } [MaxLength(500)] public string Description { get; set; } [Column(TypeName = "image")] public byte[] Photo { get; set; } public List<Lodging> Lodgings { get; set; }
}
}
Required特性标记不需要附加信息,而MaxLength和Column特性均需要提供参数.这些参数对如何映射到数据库的列进行了明确。我们想要图片储存在SQL Server的image字段里. 小贴士:只要有可能强制将数据库中字段的类型设定为指定类型(例如将byte[]强制指定为image),你可配置数据类型特性。所有的三个特性将会影响数据库的构架,其中之二,Required和MaxLength,也被用于EF框架的验证之用.在观察效果之前,也对Lodging类作些类似的修改.
Annotation特性标记可组合使用,也就是在一个类或属性上可以附加多个annotations特性.我们准备在属性附加多个配置特性.
添加下述三个注解到Lodging类的Name属性:
[Required]
[MaxLength(200)]
[MinLength(10)]
MinLenght是一个有趣的annotation特性.MaxLength在数据库有对应的含义,而
MinLength并不有.MinLength将会用于EF框架的验证,并不会影响数据库.
MinLength只能通过Data Annotations来进行配置,在Fluent API 中无对应项.
理解模型变化如何影响数据库初始化
如果再次运行控制台程序,你会得到一个InvalidOperationException异常.我们刚刚对模型作的修改并没有什么错误,问题在于Code First数据库初始化的默认行为.因此我们需要在继续探索配置时需要修复这些问题.
下面是异常的信息:
The model backing the 'BreakAwayContext' context has changed since the database was created. Either manually delete/update the database, or call
Database.SetInitializer with an IDatabaseInitializer instance. For example, the
DropCreateDatabaseIfModelChangesstrategy will automatically delete and recreate the database, and optionally seed it with new data.
自上次数据库创建以来,'BreakAwayContext'的上下文已经发生变化.要么手工删除或更新数据库,要么调用IDatabaseInitializer接口的实例 Database.SetInitializer.例如
DropCreateDatabaseIfModelChanges策略将自动删除和再创建数据库,并且可选择使用新数据作为种子.
相关推荐:
- [初中教育]婚姻家庭法学教学教案
- [初中教育]浅谈小学语文教学中的创新教育
- [初中教育]中华人民共和国侵权责任法2009
- [初中教育]2016-2022年中国薄膜太阳能电池行业发
- [初中教育]多级轻型井点降水的应用
- [初中教育]外语教学法流派介绍和简评
- [初中教育]实验一、典型环节及其阶跃响应
- [初中教育]内蒙古2012-2013学年度国家奖学金获奖
- [初中教育]移动通信营销渠道管理探讨
- [初中教育]初三化学第一学期第一第二章基础知识点
- [初中教育]一天的食物教学设计
- [初中教育]光导照明系统的基本结构及工作原理
- [初中教育]长春市十一高、东北师范大学附属中学、
- [初中教育]“十三五”规划重点-配重式装卸车项目
- [初中教育]领导方法和领导艺术
- [初中教育]第三章 植物病虫草鼠害诊断与防治基
- [初中教育]2019届九年级语文上册 第二单元 6纪念
- [初中教育]甲级单位编制水豆腐项目可行性报告(立
- [初中教育]Ch8-1补充 09101数据库系统原理及应用-
- [初中教育]2017-2023年中国吊装设备行业市场分析
- 制作毕业纪念册需要哪些材料
- 2015-2016学年高二化学苏教版选修4课件
- 哈佛管理导师-创建商业案例
- 职场交际中的谈吐礼仪知识与职场会议接
- 中国糕点及面包行业发展现状与竞争战略
- 沂河“12·7”洪水茶山拦河坝
- 管道水流量计算公式
- 4-2发电机火灾事故处置方案
- 数字信号处理实验五
- 2009年经济师(中级)金融专业知识全真试
- 历史街区保护规划--04历史文化遗产保护
- 宁夏回族自治区中小学职称评价标准
- 评先评优测评表
- 圆的切线证明及线段长求解在在中考中的
- 【解析版】2015年江苏省南京外国语学校
- 人教版八年级上册科学第一章习题精华
- 责任心与执行力
- SA8000社会责任管理体系标准培训
- IgA肾病的饮食应注意
- 杭州市建设工程文件归档整理方案(试行)