Code First: 五大映射模式

映射一

Mapping the Table-Per-Hierarchy (TPH) Inheritance

模型文件

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace DataAnnotations
{
    public class TestContext : DbContext
    {
        public DbSet<Course> Courses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            modelBuilder.Entity<Course>()
                .Map<Course>(m => m.Requires("Type").HasValue("Course"))
                .Map<OnlineCourse>(m => m.Requires("Type").HasValue("OnlineCourse"));
        }
    }//class

    public class Course
    {
        public int CourseID { get; set; }

        public string Title { get; set; }
        public int Credits { get; set; }

    }//class

    public partial class OnlineCourse : Course
    {
        public string URL { get; set; }

    }//class
}

对应的数据库代码:

CREATE TABLE [dbo].[Course] (
    [CourseID] INT            IDENTITY (1, 1) NOT NULL,
    [Title]    NVARCHAR (MAX) NULL,
    [Credits]  INT            NOT NULL,
    [URL]      NVARCHAR (MAX) NULL,
    [Type]     NVARCHAR (128) NOT NULL,
    CONSTRAINT [PK_dbo.Course] PRIMARY KEY CLUSTERED ([CourseID] ASC)
);

此是默认的策略,去掉建造者中的配置信息,代码如下:

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace DataAnnotations
{
    public class TestContext : DbContext
    {
        public DbSet<Course> Courses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }//class

    public class Course
    {
        public int CourseID { get; set; }

        public string Title { get; set; }
        public int Credits { get; set; }

    }//class

    public partial class OnlineCourse : Course
    {
        public string URL { get; set; }

    }//class
}

生成的数据库代码:

CREATE TABLE [dbo].[Course] (
    [CourseID]      INT            IDENTITY (1, 1) NOT NULL,
    [Title]         NVARCHAR (MAX) NULL,
    [Credits]       INT            NOT NULL,
    [URL]           NVARCHAR (MAX) NULL,
    [Discriminator] NVARCHAR (128) NOT NULL,
    CONSTRAINT [PK_dbo.Course] PRIMARY KEY CLUSTERED ([CourseID] ASC)
);

可见,鉴别器列被命名为Discriminator,其保存记录的类名称。

映射二

Mapping the Table-Per-Type (TPT) Inheritance

模型文件:

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace DataAnnotations
{
    public class TestContext : DbContext
    {
        public DbSet<Course> Courses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            //TPT
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<OnlineCourse>().ToTable("OnlineCourse");
        }
    }

    public class Course
    {
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }
    }

    public partial class OnlineCourse : Course
    {
        public string URL { get; set; }
    }
}

将类型名称与表名称对应,生成的数据库代码:

CREATE TABLE [dbo].[Course] (
    [CourseID] INT            IDENTITY (1, 1) NOT NULL,
    [Title]    NVARCHAR (MAX) NULL,
    [Credits]  INT            NOT NULL,
    CONSTRAINT [PK_dbo.Course] PRIMARY KEY CLUSTERED ([CourseID] ASC)
);

------------------------------------------------------------------------------------------
CREATE TABLE [dbo].[OnlineCourse] (
    [CourseID] INT            NOT NULL,
    [URL]      NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.OnlineCourse] PRIMARY KEY CLUSTERED ([CourseID] ASC),
    CONSTRAINT [FK_dbo.OnlineCourse_dbo.Course_CourseID] FOREIGN KEY ([CourseID]) REFERENCES [dbo].[Course] ([CourseID])
);

GO
CREATE NONCLUSTERED INDEX [IX_CourseID]
    ON [dbo].[OnlineCourse]([CourseID] ASC);

派生类对应的表会有一个外键,将派生表的主键与基类对应的主表关联,形成0/1..1的关系。

映射三

Mapping the Table-Per-Concrete Class (TPC) Inheritance

模型:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace DataAnnotations
{
    public class TestContext : DbContext
    {
        public DbSet<Course> Courses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

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

    public class Course
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }

        public string Title { get; set; }
        public int Credits { get; set; }
    }

    public partial class OnlineCourse : Course
    {
        public string URL { get; set; }
    }
}

生成的数据库代码:

CREATE TABLE [dbo].[Course] (
    [CourseID] INT            NOT NULL,
    [Title]    NVARCHAR (MAX) NULL,
    [Credits]  INT            NOT NULL,
    CONSTRAINT [PK_dbo.Course] PRIMARY KEY CLUSTERED ([CourseID] ASC)
);

-----------------------------------------------------------------------------------------
CREATE TABLE [dbo].[OnlineCourse] (
    [CourseID] INT            NOT NULL,
    [Title]    NVARCHAR (MAX) NULL,
    [Credits]  INT            NOT NULL,
    [URL]      NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.OnlineCourse] PRIMARY KEY CLUSTERED ([CourseID] ASC)
);

注意,主键在整个继承层次结构上唯一,而不是单个表上唯一。

映射四

Mapping Properties of an Entity Type to Multiple Tables in the Database (Entity Splitting)

模型:

using System;
using System.Data.Entity;

namespace DataAnnotations
{
    public class TestContext : DbContext
    {
        public DbSet<Department> Departments { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            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.StartDate });
                    m.ToTable("DepartmentDetails");
                });
        }
    }

    public class Department
    {
        public int DepartmentID { get; set; }
        public string Name { get; set; }
        public DateTime StartDate { get; set; }
    }
}

生成的数据库代码:

CREATE TABLE [dbo].[Department] (
    [DepartmentID] INT            IDENTITY (1, 1) NOT NULL,
    [Name]         NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.Department] PRIMARY KEY CLUSTERED ([DepartmentID] ASC)
);

----------------------------------------------------------------------------------------
CREATE TABLE [dbo].[DepartmentDetails] (
    [DepartmentID] INT      NOT NULL,
    [StartDate]    DATETIME NOT NULL,
    CONSTRAINT [PK_dbo.DepartmentDetails] PRIMARY KEY CLUSTERED ([DepartmentID] ASC),
    CONSTRAINT [FK_dbo.DepartmentDetails_dbo.Department_DepartmentID] FOREIGN KEY ([DepartmentID]) REFERENCES [dbo].[Department] ([DepartmentID])
);

GO
CREATE NONCLUSTERED INDEX [IX_DepartmentID]
    ON [dbo].[DepartmentDetails]([DepartmentID] ASC);

每个表都包含主键,第一个表的主键Identity,第二个表的主键无Identity,外键将两个表的主键关联。

时间: 2024-10-10 12:32:09

Code First: 五大映射模式的相关文章

数据对象映射模式

定义:将对象和数据存储映射起来,对一个对象的操作会映射为数据存储的操作 综合应用实例:在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性的操作,结合使用数据对象映射模式,工程模式,注册模式 $page = new Page();$page->index(); class Page{ function index() { $user = \IMooc\Factory::getUser(1); $user->name= 'fango0'; $this->t

PHP 设计模式 笔记与总结(10)数据对象映射模式 2

[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_register('\\Common\\Loader::autoload'); echo '<meta http-equiv="content-type" content="text/

Entity Framework Code First属性映射约定

参考页面: http://www.yuanjiaocheng.net/entity/code-first.html http://www.yuanjiaocheng.net/entity/mode-first.html http://www.yuanjiaocheng.net/entity/database-first.html http://www.yuanjiaocheng.net/entity/choose-development-approach.html http://www.yuan

EF Code First数据库映射规则及配置

EF Code First数据库映射规则主要包括以下方面: 1.表名及所有者映射 Data Annotation: 指定表名 1 using System.ComponentModel.DataAnnotations;2 3 [Table("Product")]4 public class Product指定表名及用户 using System.ComponentModel.DataAnnotations;[Table("Product", Schema = &qu

GDI映射模式

GDI 映射模式 MM_TEXT 1逻辑单位 = 1像素 MM_LOMETRIC 1逻辑单位 = 0.1mm MM_HIMETRIC 1逻辑单位 = 0.01mm MM_LOENGLISH 1逻辑单位 = 0.01 in = 0.254mm MM_HIENGLISH 1逻辑单位 = 0.001 in = 0.0254mm MM_TWIPS 1逻辑单位 = 1/1440 in = 0.0176mm 默认映射模式:MM_TEXT MM_LOMETRIC MM_HIMETRIC MM_LOENGLIS

MFC绘图控制-映射模式

一.映射模式基本概念 映射模式是设备描述表属性,用于确定从逻辑坐标值到设备坐标值的转换方式.传送给CDC输出函数的是逻辑坐标值.设备坐标值是指窗口中相应的像素点位置. MM_TEXT为默认映射模式,如果使用其他映射模式,可调用CDC::SetMapMode(). dc.SetMapMode(MM_LOMETRIC); //Do some drawing Windows支持8种不同的映射模式,属性分别如下: 说明:如果在MM_LOENGLISH映射模式下画一条100单位长的线,它可能不是正好1英寸

ZF框架数据对象映射模式的思考

最近学了ZF框架,对手册中DB这一节Zend_Db_Table_Row的介绍中说,使用了Zend_Db_Table::find()或::findRow()方法可以返回一个Zend_Db_Table_Row的对象,该对象自动映射到表中的这一行记录,字段和类属性完全关联在一起(字段名是下划线分隔的,属性名由首个单词小写的驼峰式命名,如自动“last_name”,则操作时属性名“lastName”),获取任何字段就直接像操作类属性一样,如: $row = $table->fetchRow('first

数据对象映射模式(转)

php中的设计模式中有很多的各种模式了,在这里我们来为各位介绍一个不常用的数据映射模式吧,希望文章能够帮助到各位. 数据映射模式使您能更好的组织你的应用程序与数据库进行交互. 数据映射模式将对象的属性与存储它们的表字段间的结合密度降低.数据映射模式的本质就是一个类,它映射或是翻译类的属性或是方法到数据库的相应字段,反之亦然. 数据映射的作用(工作)就在于能对双方所呈现出的信息的理解,并能对信息的存取进行控制,如根据存储在数据表中的信息 重建新的域对象,或是用域对象的信息来更新或删除数据表中的相关

PHP 设计模式 笔记与总结(9)数据对象映射模式

[数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数据库,跟数据库中表的一条记录对应起来. [代码实现] 在代码中实现数据对象映射模式,我们将实现一个 ORM(对象关系映射 Object Relational Mapping) 类,将复杂的 SQL 语句映射成对象属性的操作.同时结合[工厂模式]和[注册模式]使用. [例1] 数据库 test ,us