1. 程式人生 > >EF使用EntityTypeConfiguration配置映射關系

EF使用EntityTypeConfiguration配置映射關系

使用 是否 用戶信息 detail cal 配置 擴展 you option

我們可以定義一個繼承自EntityTypeConfiguration<>泛型類的類來定義domain中每個類的數據庫配置,我們在這個自定義類的構造函數中使用我們上次提到的那些方法配置數據庫的映射。

實體類關系的映射

實體類映射中,關系的映射配置在關系的兩端都可以配置。例如,用戶信息與登錄信息的 一對多 關系可以在用戶信息端配置:

HasMany(m => m.LoginLogs).WithRequired(n => n.Member);

等效於在登錄日誌信息端配置:

HasRequired(m => m.Member).WithMany(n => n.LoginLogs);

但是,如果所有的關系映射都在作為主體的用戶信息端進行配置,勢必造成用戶信息端配置的臃腫與職責不明。所以,為了保持各個實體類型的職責單一,實體關系推薦在關系的非主體端進行映射。

用戶信息映射類,用戶信息是關系的主體,所有的關系都不在此映射類中進行配置

namespace GMF.Demo.Core.Data.Configurations
{
    public class MemberConfiguration : EntityTypeConfiguration<Member>
    {
    }
}

用戶擴展信息映射類,配置用戶擴展信息與用戶信息的 0:1 關系

namespace GMF.Demo.Core.Data.Configurations
{
    public class MemberExtendConfiguration : EntityTypeConfiguration<MemberExtend>
    {
        public MemberExtendConfiguration()
        {
            HasRequired(m => m.Member).WithOptional(n => n.Extend);
        }
    }
}

數據庫模型發生改變的處理

暴力處理:直接刪除掉後重新生成

namespace Portal
{
    public class PortalContext : DbContext
    {
        static PortalContext()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>());
        }

        public DbSet<Province> Provinces { get; set; }
        public DbSet<Category> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new ProvinceMap());
            modelBuilder.Configurations.Add(new CategoryMap());
        }
    }
}
DropCreateDatabaseIfModelChanges<PortalContext>()太暴力了

Code First數據庫遷移

改變原來類的結構後數據庫將發生錯誤提示

1.第一次建立數據庫遷移通過nugget來進行編輯

Package Manager Console-》Enable-Migrations -StartUpProjectName CodeFirst-》執行“Add-Migration FirstMigration”命令-》

執行“Update-Database”命令,更新數據庫架構

你的項目中將自動生成一個名為”Migrations“的文件夾,裏面包含兩個文件: Configuration.cs和201308211510117_InitialCreate.cs(201308211510117是時間戳)。

Configuration.cs:是遷移配置代碼,一般我們不需要修改。

namespace CodeFirst.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<CodeFirst.OrderContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

        protected override void Seed(CodeFirst.OrderContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }

201308211510117_InitialCreate.cs:以代碼的形式記錄了本地數據庫的表結構定義。

設置自動遷移

有以下兩個參數可以對自動遷移進行設置:
1. AutomaticMigrationsEnabled:獲取或設置 指示遷移數據庫時是否可使用自動遷移的值。
2. AutomaticMigrationDataLossAllowed:獲取或設置 指示是否可接受自動遷移期間的數據丟失的值。如果設置為false,則將在數據丟失可能作為自動遷移一部分出現時引發異常。

來自: http://www.mamicode.com/info-detail-872834.html

EF使用EntityTypeConfiguration配置映射關系