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,外键将两个表的主键关联。
映射五
Mapping Multiple Entity Types to One Table in the Database (Table Splitting)
这个模式主要用于懒惰加载,模型文件:
using System.ComponentModel.DataAnnotations;
using System.Data.Entity; namespace DataAnnotations
{
public class TestContext : DbContext
{
public DbSet<Instructor> Instructors { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Instructor>()
.HasRequired(t => t.OfficeAssignment)
.WithRequiredPrincipal(t => t.Instructor); modelBuilder.Entity<Instructor>().ToTable("Instructor");
modelBuilder.Entity<OfficeAssignment>().ToTable("Instructor");
}
}// TestContext public class Instructor
{
public int InstructorID { get; set; }
public string Name { get; set; } // 导航属性
public OfficeAssignment OfficeAssignment { get; set; }
} public class OfficeAssignment
{
[Key]
public int InstructorID { get; set; }
public string Location { get; set; } // 导航属性
public Instructor Instructor { get; set; }
} }
生成的数据库代码为:
CREATE TABLE [dbo].[Instructor] (
[InstructorID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Location] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Instructor] PRIMARY KEY CLUSTERED ([InstructorID] ASC)
);
Code First: 五大映射模式的更多相关文章
- Windows GDI 映射模式(出自:Windows程序设计第5版-珍藏版)
GDI映射模式(mapping mode):和映射模式紧密相关的还有4个其它的设备环境属性:1.窗口原点(window origin)2.视口原点(viewport origin)3.窗口范围(win ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- php设计模式 数据对象映射模式
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...
- MFC坐标空间与映射模式
逻辑坐标:使用GDI绘图时使用的坐标系 设备坐标系:实际设备(显示器.打印机)的坐标系,即我们实际看到的坐标系. 坐标空间 在Windows NT/2000中Win32 API中支持以下四层坐标空间: ...
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...
- PHP 设计模式 笔记与总结(9)数据对象映射模式
[数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...
- Shapefile文件中的坐标绘制到屏幕时的映射模式设置
pDC->SetMapMode(MM_ANISOTROPIC ); //首先选择MM_ANISOTROPIC映射模式,其它映射模式都不合适 pDC->SetWindowExt( max(a ...
- Visual C++ 打印编程技术-编程基础-映射模式
映射模式: Visual C++ 中采用的坐标映射方式使得用户图形坐标和输出设别的像素完全一致. eg:当屏幕的像素大小为800X600时,每英寸包含屏幕像素为96,打印机则需要几倍的点数才能达到同样 ...
- PHP设计模式笔记六:数据对象映射模式 -- Rango韩老师 http://www.imooc.com/learn/236
数据对象映射模式 1.数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作 2.在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性 ...
随机推荐
- PAT 1077. 互评成绩计算
PAT 1077. 互评成绩计算 在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个 ...
- word 给段落添加背景色
word 2007 单击"页面布局"选项卡->单击"页面背景"一栏中的"页面边框"->(弹出边框与底纹对话框)->点击底纹 ...
- Github上600多个iOS开源项目分类及介绍
将Github上600多个iOS开源项目进行分类并且有相应介绍,小伙伴们快来看呀 地址:http://github.ibireme.com/github/list/ios/
- 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞
n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...
- cdq分治入门--BZOJ3262: 陌上花开
n<=100000个人,每个人三个属性Ai,Bi,Ci,一个人i的等级为Ai>=Aj,Bi>=Bj,Ci>=Cj的人数,求每个等级有多少人. 裸的三维偏序.按照常规思路,一维排 ...
- NOIP2012提高组D1T3 开车旅行
n<=100000个山,每个山有高度,从一个山到另一个山代价为高度差,有A和B两人一起开车,A每次选前进方向的次近山,B选最近,保证山高度不同且如果代价相同的山低的代价算小,每次旅行先A走,然后 ...
- BZOJ2272: [Usaco2011 Feb]Cowlphabet 奶牛文字
n<=250个大写字母和m<=250个小写字母,给p<=200个合法相邻字母,求用这些合法相邻字母的规则和n+m个字母能合成多少合法串,答案mod 97654321. 什么鬼膜数.. ...
- codevs 3971 航班
题目描述 Description B 国有N 座城市,其中1 号是这座国家的首都. N 座城市之间有M 趟双向航班.i 号点的转机次数定义为:从1 号点到i ,最少需要转机几 次.如果1 根本无法到达 ...
- 封装HttpURLConnection
package com.pingyijinren.test; import java.io.BufferedReader; import java.io.InputStream; import jav ...
- 远程调试 Android 设备使用入门(谷歌翻译版)
移动前端调试方案(Android + Chrome 实现远程调试) 目录 要求 第 1 步:发现您的 Android 设备 第 2 步:从您的开发计算机调试 Android 设备上的内容. 更多操作: ...