教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 初中教育 >

使用Entity. Framework编程(2)(2)

来源:网络收集 时间:2025-09-17
导读: 字符串属性的约定 字符串约定为映射到不限长度的非空列中。由数据库引擎来负责确定映射到何种类型。对于SQL Server而言,默认数据类型为nvarchar(max)。这就是你在图2-1看到的所有的字符串属性都映射成了nvarchar(m

字符串属性的约定

字符串约定为映射到不限长度的非空列中。由数据库引擎来负责确定映射到何种类型。对于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策略将自动删除和再创建数据库,并且可选择使用新数据作为种子.

…… 此处隐藏:4122字,全部文档内容请下载后查看。喜欢就下载吧 ……

使用Entity. Framework编程(2)(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/46797.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)