最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Entity?Framework映射TPH、TPT、TPC與繼承類

 更新時間:2022年06月13日 15:36:17   作者:springsnow  
這篇文章介紹了Entity?Framework映射TPH、TPT、TPC與繼承類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、TPH

Table Per Hierarchy (默認(rèn),每個層次一個表)

每個層次結(jié)構(gòu)共用一個表,類的每一個屬性都必須是可空的。

1、默認(rèn)行為

只建立一個表,把基類和子類中的所有屬性都映射為表中的列。 
為基類和所有子類共建立一個表,基類和子類中的所有屬性都映射為表中的一個列。

默認(rèn)在這個表中建立一個叫做Discriminator的列,類型是nvarchar,長度是128。在存儲基類或子類的時候,把類名作為Discriminator列的值。

2、Fluent API修改默認(rèn)行為

Map方法中傳入的類型參數(shù)是子類的類名,Requires用于指定Discriminator列的名字,HasValue用于指定它的類型和每個子類對應(yīng)的值。

modelBuilder.Entity<Course>() 
    .Map<Course>(m => m.Requires("Type").HasValue("Course")) 
     .Map<OnsiteCourse>(m => m.Requires("Type").HasValue("OnsiteCourse"));

二、TPT

Table Per Type(每個類各一個表)

1、默認(rèn)行為

為基類和每個子類各建立一個表,每個與子類對應(yīng)的表中只包含子類特有的屬性對應(yīng)的列。 
子類的表中只包含子類特有的屬性,子表還會存儲一個將子表與基表聯(lián)接的外鍵。

2、Fluent API修改默認(rèn)行為

我們可以使用Map方法強(qiáng)制讓Code First使用TPT方式,因為Code First默認(rèn)使用的是TPH方式。

modelBuilder.Entity<Course>().ToTable("Course"); 
modelBuilder.Entity<OnsiteCourse>().ToTable("OnsiteCourse");

三、TPC

Table Per ConCrete Type(每個具體類型各一個表)

每個具體的派生類各一個表,沒有基表。不推薦使用。

1、默認(rèn)行為

在子類對應(yīng)的表中除了子類特有的屬性外還有基類的屬性對應(yīng)的表?;惪梢允莂bstract。

2、Fluent API修改默認(rèn)行為

通過MapInheritedProperties方法就可以強(qiáng)制Code First使用TPC方式。

注意:因為屬于 TPC 繼承層次結(jié)構(gòu)的表并不使用同一個主鍵, 關(guān)閉主鍵屬性的標(biāo)識,避免為不同子表插入重復(fù)的實體鍵。

modelBuilder.Entity<Course>()
     .Property(c => c.CourseID)
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

modelBuilder.Entity<OnsiteCourse>().Map(m =>
 {
     m.MapInheritedProperties();
     m.ToTable("OnsiteCourse");
 });

modelBuilder.Entity<OnlineCourse>().Map(m =>
 {
     m.MapInheritedProperties();
     m.ToTable("OnlineCourse");
 });

四、實體拆分

允許一個實體類型的屬性分散在多個表中。 
實體拆分通過多次調(diào)用 Map 方法將一部分屬性映射到特定表。 
在以下示例中,Department 實體拆分到兩個表中:Department 和 DepartmentDetails。

modelBuilder.Entity<Department>() 
    .Map(m =>
    {
        m.Properties(t => new { t.DepartmentID, t.Name });
        m.ToTable("Department");
    }).
     Map(m =>
    {
        m.Properties(t => new { t.DepartmentID, t.Administrator, t.StartDate, t.Budget });
         m.ToTable("DepartmentDetails");
     });

五、表拆分

兩個實體類型映射到同一個表。

1.兩個類必須共享同一個主鍵。 
2.兩個類之間的關(guān)系必須被映射為表之間的一對一關(guān)系。

modelBuilder.Entity<OfficeAssignment>().HasKey(t => t.InstructorID);  //共用主鍵
modelBuilder.Entity<Instructor>() .HasRequired(t => t.OfficeAssignment).WithRequiredPrincipal(t => t.Instructor);//一對一關(guān)系

modelBuilder.Entity<Instructor>().ToTable("Instructor");
modelBuilder.Entity<OfficeAssignment>().ToTable("Instructor");

六、將類指定為復(fù)雜類型

1、指定方法:

DataAnnotations方式:

[ConlexType]
public Details details;

或FluentAPI:

modelBuilder.ComplexType<Details>();

注意: 
1.復(fù)雜類型類不能有主鍵。 
2.復(fù)雜類型只能包含.net基礎(chǔ)類型的屬性。 
3.使用復(fù)雜類型的類,只能包復(fù)雜類型的一個實例,不能使用復(fù)雜類型的集合。

2、配置復(fù)雜類型的屬性

(1)、可以對 ComplexTypeConfiguration 調(diào)用 Property。

modelBuilder.ComplexType<Details>() .Property(t => t.Location).HasMaxLength(20);

public class AddressComplexTypeConfiguration:ComplexTypeConfiguration<Address>
    {
        public AddressComplexTypeConfiguration()
        {
            Property(a => a.Country).HasColumnName("Country").HasMaxLength(100);
            Property(a => a.ZipCode).HasColumnName("ZipCode").HasMaxLength(6);
         }
     }

(2)、也可以使用點表示法訪問復(fù)雜類型的屬性。

modelBuilder.Entity<OnsiteCourse>().Property(t => t.Details.Location) .HasMaxLength(20);

七、DataBase初始化

1、調(diào)用Database.SetInitializer方法:

一般Global.ascx.cs,Main應(yīng)用程序的入口等地方調(diào)用Database.SetInitializer方法:

  • 只要Fluent API配置的數(shù)據(jù)庫映射發(fā)生變化或者domain中的model發(fā)生變化了,就把以前的數(shù)據(jù)庫刪除掉,根據(jù)新的配置重新建立數(shù)據(jù)庫。
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>());
  • 只有在沒有數(shù)據(jù)庫的時候才會根據(jù)數(shù)據(jù)庫連接配置創(chuàng)建新的數(shù)據(jù)庫。這種配置主要用于production環(huán)境。
    Database.SetInitializer(new CreateDatabaseIfNotExists<BreakAwayContext>());
  • 不管數(shù)據(jù)庫映射或者model是否發(fā)生變化,每次都重新刪除并根據(jù)配置重建數(shù)據(jù)庫。
    Database.SetInitializer(new DropCreateDatabaseAlways<BreakAwayContext>());

2、通過配置文件更靈活的指定數(shù)據(jù)庫初始化的方式:

<?xml version="1.0"?>
 <configuration>
 <appSettings>
   <add key="DatabaseInitializerForTypeOrderSystemContext" value="System.Data.Entity.DropCreateDatabaseIfModelChanges[[OrderSystemContext]], EntityFramework" /> 
 </appSettings>
 </configuration>

3、自定義數(shù)據(jù)庫初始化類

通過自定的初始化類,還可以將一些基礎(chǔ)數(shù)據(jù)在創(chuàng)建數(shù)據(jù)庫之后插入到數(shù)據(jù)庫中去。

public class DropCreateOrderDatabaseWithSeedValueAlways : DropCreateDatabaseAlways<OrderSystemContext>
   {
       protected override void Seed(OrderSystemContext context)
       {
            context.ProductCatalogs.Add(new ProductCatalog { CatalogName = "DELL E6400", Manufactory = "DELL", ListPrice = 5600, NetPrice = 4300 });
            context.ProductCatalogs.Add(new ProductCatalog { CatalogName = "DELL E6420", Manufactory = "DELL", ListPrice = 7000, NetPrice = 5400 });
        }
    } 

Database.SetInitializer(new DropCreateOrderDatabaseWithSeedValueAlways());

到此這篇關(guān)于Entity Framework映射TPH、TPT、TPC與繼承類的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#異常處理詳解

    C#異常處理詳解

    這篇文章介紹了C#異常處理,有需要的朋友可以參考一下
    2013-10-10
  • C#使用日志組件log4net

    C#使用日志組件log4net

    這篇文章介紹了C#日志組件log4net的使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#實現(xiàn)掃雷游戲

    C#實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C#實現(xiàn)Nginx平滑加權(quán)輪詢算法

    C#實現(xiàn)Nginx平滑加權(quán)輪詢算法

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)Nginx平滑加權(quán)輪詢算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Unity存儲游戲數(shù)據(jù)的多種方法小結(jié)

    Unity存儲游戲數(shù)據(jù)的多種方法小結(jié)

    這篇文章主要介紹了Unity存儲游戲數(shù)據(jù)的幾種方法,在游戲開發(fā)中,存儲游戲數(shù)據(jù)是非常重要的,因為游戲數(shù)據(jù)決定了游戲的各個方面,例如游戲的進(jìn)度、玩家的成就、游戲的設(shè)置,需要的朋友可以參考下
    2023-02-02
  • C#實現(xiàn)快捷鍵的幾種常用方法匯總

    C#實現(xiàn)快捷鍵的幾種常用方法匯總

    這篇文章主要介紹了C#實現(xiàn)快捷鍵的幾種常用方法,非常實用,需要的朋友可以參考下
    2014-08-08
  • C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置實例

    C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置實例

    這篇文章主要介紹了C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置實例,對C#全局熱鍵設(shè)置與窗體熱鍵設(shè)置的實現(xiàn)方法與具體代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以參考下
    2014-10-10
  • Unity shader實現(xiàn)百葉窗特效

    Unity shader實現(xiàn)百葉窗特效

    這篇文章主要為大家詳細(xì)介紹了Unity shader實現(xiàn)百葉窗特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#中加鹽(salting)的實現(xiàn)示例

    C#中加鹽(salting)的實現(xiàn)示例

    在密碼存儲和驗證中,加鹽是一種增加密碼安全性的技術(shù),本文主要介紹了C#中加鹽(salting)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • WPF利用CommunityToolkit.Mvvm實現(xiàn)級聯(lián)選擇器

    WPF利用CommunityToolkit.Mvvm實現(xiàn)級聯(lián)選擇器

    這篇文章主要介紹了WPF如何利用CommunityToolkit.Mvvm實現(xiàn)級聯(lián)選擇器,文中的示例代碼講解詳細(xì),對我們的學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下
    2023-12-12

最新評論

格尔木市| 喀喇沁旗| 德庆县| 鄱阳县| 南雄市| 桂阳县| 信丰县| 塘沽区| 平利县| 宁德市| 霍州市| 嘉鱼县| 寿阳县| 城固县| 太仓市| 舒城县| 筠连县| 吉林省| 夏邑县| 三门县| 婺源县| 宜城市| 扎囊县| 吉隆县| 鸡泽县| 苗栗县| 酉阳| 静安区| 慈溪市| 连云港市| 蒙阴县| 澄城县| 平陆县| 彝良县| 深圳市| 敦化市| 二连浩特市| 苍溪县| 德安县| 肥乡县| 芜湖市|