欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

EF使用數(shù)據(jù)注解特性創(chuàng)建表結(jié)構(gòu)

 更新時(shí)間:2022年03月03日 10:43:31   作者:.NET開發(fā)菜鳥  
本文詳細(xì)講解了EF使用數(shù)據(jù)注解特性創(chuàng)建表結(jié)構(gòu)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

  傳統(tǒng)設(shè)計(jì)應(yīng)用的方式都是由下而上的,即我們習(xí)慣優(yōu)先考慮數(shù)據(jù)庫(kù),然后使用這個(gè)以數(shù)據(jù)為中心的方法在數(shù)據(jù)之上構(gòu)建應(yīng)用程序。這種方法非常適合于數(shù)據(jù)密集的應(yīng)用或者數(shù)據(jù)庫(kù)很可能包含多個(gè)應(yīng)用使用的業(yè)務(wù)邏輯的應(yīng)用。對(duì)于這種應(yīng)用,如果要使用EF的話,我們必須使用Database First方式。
  設(shè)計(jì)應(yīng)用的另一種方法就是以領(lǐng)域?yàn)橹行牡姆绞剑I(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD)。DDD是一種由上而下的方式,我們通過(guò)從實(shí)現(xiàn)應(yīng)用所需要的領(lǐng)域模型和實(shí)體的角度思考,從而開始設(shè)計(jì)應(yīng)用。數(shù)據(jù)庫(kù)很少用來(lái)用于領(lǐng)域模型數(shù)據(jù)的持久化。使用DDD意味著我們要根據(jù)每個(gè)應(yīng)用的需求來(lái)設(shè)計(jì)模型和實(shí)體,而且模型和實(shí)體是數(shù)據(jù)庫(kù)可忽略的,即可以使用任何數(shù)據(jù)庫(kù)技術(shù)實(shí)現(xiàn)保存。在這些情景中,我們應(yīng)該使用EF的Code First方式,因?yàn)樗试S我們創(chuàng)建POCO(Plain Old CLR Objects)作為持久化可忽略的領(lǐng)域模型。
使用Code First的優(yōu)勢(shì)在于:

  • 1、支持DDD。
  • 2、可以早早地著手開發(fā),因?yàn)槲覀儾槐氐却龜?shù)據(jù)庫(kù)的創(chuàng)建。
  • 3、持久化層(底層的數(shù)據(jù)庫(kù))的改變不會(huì)對(duì)現(xiàn)有的模型有任何影響。

  我們需要搞清楚的第一件事就是約定大于配置的概念。Code First方式期望模型類遵守一些約定,這樣的話數(shù)據(jù)庫(kù)持久化邏輯就可以從模型中提取出來(lái)。比如,如果我們給一個(gè)模型定義了一個(gè)Id屬性,那么它就會(huì)映射到數(shù)據(jù)庫(kù)中該類所對(duì)應(yīng)的那張表的主鍵。這種基于約定的方式的好處在于:如果我們遵守了這些約定,那么我們就不必寫額外的代碼來(lái)管理數(shù)據(jù)庫(kù)持久邏輯。但這樣也存在缺點(diǎn),缺點(diǎn)在于:如果沒(méi)有遵守某個(gè)約定,那么EF就不會(huì)從模型中提取到需要的信息,運(yùn)行時(shí)會(huì)拋異常。
  在這種沒(méi)有遵守約定又要持久化數(shù)據(jù)的情況下,我們需要使用Code First的配置項(xiàng)提供關(guān)于模型一些額外的信息。比如,如果我們的模型類中沒(méi)有Id屬性作為主鍵,那么我們需要在想要的屬性上加上[Key]特性,這樣它就會(huì)被當(dāng)作主鍵了。
注意:

EF使用模型類的復(fù)數(shù)的約定來(lái)創(chuàng)建數(shù)據(jù)表名,創(chuàng)建的列名和該類的屬性名是一樣的。

示例:

使用在EF應(yīng)用一:Code First模式中介紹的使用方法創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),其中實(shí)體類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; }
    }
}

數(shù)據(jù)庫(kù)上下文Context類定義如下:

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

namespace EFAppointmentCreateTable.EFContext
{
    /// <summary>
    /// 定義數(shù)據(jù)庫(kù)上下文類,該類繼承自DbContext
    /// </summary>
    public class Context:DbContext
    {
        /// <summary>
        /// 定義構(gòu)造函數(shù),繼承自父類的構(gòu)造函數(shù),通過(guò)繼承父類的構(gòu)造函數(shù)來(lái)創(chuàng)建數(shù)據(jù)庫(kù)
        /// 父類構(gòu)造函數(shù)的參數(shù)是配置文件中配置的數(shù)據(jù)庫(kù)連接字符串
        /// </summary>
        public Context()
            : base("DbConnection")
        { }

         //實(shí)體屬性集合  根據(jù)實(shí)體名稱的復(fù)數(shù)形式生成數(shù)據(jù)庫(kù)的表名
        // 生成的表名是Products 和屬性名Products無(wú)關(guān)
        // 即使把屬性名改成Product,生成的表名還是Products 約定大于配置
        public DbSet<Product> Products { get; set; }
    }
}

創(chuàng)建后的數(shù)據(jù)庫(kù)截圖如下:

從上面的截圖中可以看出,生成的數(shù)據(jù)庫(kù)表名是實(shí)體Product的復(fù)數(shù)形式,使用默認(rèn)約定生成Id主鍵列。

二、使用數(shù)據(jù)注解創(chuàng)建表結(jié)構(gòu)

1、.NET數(shù)據(jù)類型和SQL數(shù)據(jù)類型之間的映射

首先EF這個(gè)ORM工具就是用來(lái)解決.NET類型和SQL Server列類型之間的阻抗失配的問(wèn)題。比如,假設(shè)你在.net中定義了一個(gè)int類型的屬性,那么你就可以認(rèn)為EF已經(jīng)安全地處理了這個(gè)列的定義并使用了合適的類型與之對(duì)應(yīng)。記住一些.NET類型和SQL Server列類型之間的映射是很有必要的,下面是一些最常用的映射關(guān)系:

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數(shù)據(jù)類型映射,如果你使用的是其他類型的數(shù)據(jù)庫(kù),你可以在網(wǎng)上自行查找。比如,,如果是Oracle,那么你可以在這里查找:oracle數(shù)據(jù)類型映射。

2、配置原始屬性

以.NET中的string類型的屬性開始討論。SQL Server中的很多類型都會(huì)映射到.NET中的string類型,其他主流的RDBMS也是一樣的。因此,決定如何存儲(chǔ)字符串類型的信息是很重要的,很多關(guān)系數(shù)據(jù)庫(kù)管理引擎都有多個(gè)字符存儲(chǔ)類型,他們通常都有以字母N打頭的字符類型,這個(gè)字母表示要存在這些列中的數(shù)據(jù)是Unicode數(shù)據(jù),基于每個(gè)字符以2個(gè)字節(jié)的格式存儲(chǔ)。因此,如果你的數(shù)據(jù)庫(kù)中的列存儲(chǔ)的是英文的話,就可以使用varchar或者char(可能會(huì)加速查詢),如果使用的是中文的話,就要使用nvarchar或者nchar。此外,還可以使用帶有var的字符類型來(lái)指定列的長(zhǎng)度是可變的,不使用var的話,字符長(zhǎng)度是不可變的。
在EF中有以下幾種配置數(shù)據(jù)庫(kù)結(jié)構(gòu)的方式,分別是:

  • 1、特性,也叫數(shù)據(jù)注解。
  • 2、DbModelBuilder API。
  • 3、配置伙伴類。

3、特性(數(shù)據(jù)注解)

這些特性類都是.NET的一部分,位于System.ComponentModel.DataAnnotaions命名空間下。下面我們修改在上一個(gè)例子中使用的Product實(shí)體類,修改后的Product實(shí)體類如下:

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特性指示生成的數(shù)據(jù)庫(kù)表中的列名
        [Column("ID")]
        public int ProductId { get; set; }

        /// <summary>
        /// StringLength設(shè)置數(shù)據(jù)庫(kù)表中列的長(zhǎng)度
        /// 指示ProductName字段的最大長(zhǎng)度是10,最小長(zhǎng)度是2
        /// </summary>
        [StringLength(10,MinimumLength=2)]
        public string ProductName { get; set; }


        public double ProductPrice { get; set; }

        /// <summary>
        /// DataType特性指示生成的數(shù)據(jù)庫(kù)表中列的數(shù)據(jù)類型
        /// </summary>
        [DataType(DataType.DateTime)]
        public DateTime ProductionTime { get; set; }

        /// <summary>
        /// NotMapped特性指示不把該屬性映射到數(shù)據(jù)庫(kù)表中,即在生成的表中沒(méi)有d這一列
        /// </summary>
        [NotMapped]
        public decimal d { get; set; }
    }
}

運(yùn)行程序后生成的數(shù)據(jù)庫(kù):

修改代碼之后,我們將表的名字使用Table特性全部重新命名成了但是,將Product的主鍵通過(guò)Column特性更改為Id,Key特性指定它是主鍵,還通過(guò)StringLength指定了ProductName列的最大長(zhǎng)度為10個(gè)字符,最小為2個(gè)字符。

此外,數(shù)據(jù)注解也可以用作驗(yàn)證特性。如果持久化數(shù)據(jù)時(shí),模型對(duì)象的屬性值和數(shù)據(jù)注解所標(biāo)記的不一致,就會(huì)拋異常。

數(shù)據(jù)驗(yàn)證相關(guān)的數(shù)據(jù)注解:

特性解釋
Remote使用 jQuery 驗(yàn)證插件遠(yuǎn)程驗(yàn)證程序的特性
FileExtension驗(yàn)證文件擴(kuò)展名
Compare比較兩個(gè)屬性的值
RegularExpression使用正則表達(dá)式驗(yàn)證
CustomValidation自定義驗(yàn)證方法
DataType指定要與數(shù)據(jù)字段關(guān)聯(lián)的附加類型的名稱
EmailAddress電子郵件地址(相當(dāng)于DataType(DataType.Email))
Phone電話(相當(dāng)于DataType(DataType.Phone))
CreditCard信用卡號(hào)碼(相當(dāng)于DataType(DataType.CreditCard))
Url驗(yàn)證URL(相當(dāng)于DataType(DataType.Url))
MemberShipPassword驗(yàn)證密碼字段是否滿足成員資格提供程序的當(dāng)前密碼要求

數(shù)據(jù)映射相關(guān)的數(shù)據(jù)注解:

特性解釋
Key主鍵字段
Column數(shù)據(jù)庫(kù)列屬性映射
NotMapped不要?jiǎng)?chuàng)建對(duì)應(yīng)的字段
Table指定類將映射到的數(shù)據(jù)庫(kù)表
ForeignKey表示關(guān)系中用作外鍵的屬性
DatabaseGenerated

指定屬性應(yīng)該映射到數(shù)據(jù)表中計(jì)算的列。也可以用于映射到自動(dòng)增長(zhǎng)的數(shù)據(jù)庫(kù)表。

指定數(shù)據(jù)庫(kù)生成屬性值的方式(EF不追蹤屬性的變化)
Required必填字段
MaxLength指定屬性中允許的數(shù)組或字符串?dāng)?shù)據(jù)的最大長(zhǎng)度
MinLength指定屬性中允許的數(shù)組或字符串?dāng)?shù)據(jù)的最小長(zhǎng)度
StringLength指定最小和最大字符長(zhǎng)度
Range指定數(shù)值范圍 

數(shù)據(jù)顯示相關(guān)的數(shù)據(jù)注解: 

特性解釋
DisplayName指定本地化的字符串(習(xí)慣用語(yǔ)類)
Display指定本地化的字符串(習(xí)慣用語(yǔ)屬性)
DisplayFormat設(shè)置數(shù)據(jù)字段的格式
ReadOnly指定該特性所綁定到的屬性是只讀屬性還是讀/寫屬性
EditAble指示數(shù)據(jù)字段是否可編輯
HiddenInput指示是否應(yīng)將屬性值或字段值呈現(xiàn)為隱藏的 input 元素
ScaffoldColumn指定類或數(shù)據(jù)列是否使用基架
UIHint指定動(dòng)態(tài)數(shù)據(jù)用來(lái)顯示數(shù)據(jù)字段的模板

其他:

特性解釋
DisplayColumn將所引用的表中顯示的列指定為外鍵列
Description可視化設(shè)計(jì)器在引用組件成員時(shí)可以顯示指定的說(shuō)明
(命名空間:System.ComponentModel.DescriptionAttribute)

到此這篇關(guān)于EF使用數(shù)據(jù)注解特性創(chuàng)建表結(jié)構(gòu)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • silverlight用webclient大文件上傳的實(shí)例代碼

    silverlight用webclient大文件上傳的實(shí)例代碼

    這篇文章介紹了silverlight用webclient大文件上傳的實(shí)例代碼,有需要的朋友可以參考一下
    2013-10-10
  • 常用JavaScript代碼提示公共類封裝

    常用JavaScript代碼提示公共類封裝

    常用JavaScript代碼提示公共類整理封裝,可直接用于項(xiàng)目開發(fā), 作為開發(fā)常用代碼,還是有一定使用價(jià)值的,呵呵
    2009-08-08
  • aspnet_regsql.exe 工具注冊(cè)數(shù)據(jù)庫(kù)的圖文方法

    aspnet_regsql.exe 工具注冊(cè)數(shù)據(jù)庫(kù)的圖文方法

    自 ASP.NET 2.0 起,微軟在 ASP.NET 上新增了很多功能,其中包括 Membership , Role , Profile 等等諸多功能
    2010-03-03
  • .Net Core自定義配置源從配置中心讀取配置的方法

    .Net Core自定義配置源從配置中心讀取配置的方法

    這篇文章主要給大家介紹了關(guān)于.Net Core自定義配置源從配置中心讀取配置的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • ASP.NET讀取RSS的方法

    ASP.NET讀取RSS的方法

    這篇文章主要介紹了ASP.NET讀取RSS的方法,非常實(shí)用的技巧,需要的朋友可以參考下
    2014-08-08
  • Discuz!NT 3與asp.net 整合的實(shí)例教程

    Discuz!NT 3與asp.net 整合的實(shí)例教程

    本次整合只針對(duì)NETSNS中的代碼做了少許修改,完成了基本的和論壇同步注冊(cè),登陸和注銷,信息獲取,信息修改。為的是給各位Discuz!NT API愛(ài)好者做一個(gè)簡(jiǎn)單的API事例,供大家參考。
    2009-11-11
  • 你應(yīng)該知道的.NET錯(cuò)誤與異常處理機(jī)制

    你應(yīng)該知道的.NET錯(cuò)誤與異常處理機(jī)制

    這篇文章主要給大家介紹了關(guān)于.NET錯(cuò)誤與異常處理機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • asp.net開發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性

    asp.net開發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性

    這篇文章主要介紹了asp.net開發(fā)微信公眾平臺(tái)之驗(yàn)證消息的真實(shí)性的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • Visual Studio 2017開發(fā)環(huán)境的安裝圖文教程

    Visual Studio 2017開發(fā)環(huán)境的安裝圖文教程

    Visual Studio 2017是微軟于2017年3月8日正式推出的新版本,是迄今為止 最具生產(chǎn)力 的 Visual Studio 版本。這篇文章主要介紹了Visual Studio 2017開發(fā)環(huán)境的安裝,需要的朋友可以參考下
    2017-11-11
  • 動(dòng)態(tài)代理的5模式使用示例和Mixin模式

    動(dòng)態(tài)代理的5模式使用示例和Mixin模式

    什么叫"動(dòng)態(tài)代理",代理模式我們都知道,動(dòng)態(tài)代理就是動(dòng)態(tài)生成的代理(采用Emit)。5種代理模式:ClassProxy、ClassProxyWithTarget、InterfaceProxyWithoutTarget、InterfaceProxyWithTarget、InterfaceProxyWithTargetInterface、Mixin模式
    2013-11-11

最新評(píng)論