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语句映射成对象属性 ...
随机推荐
- db2事务日志已满解决办法
查看事务日志配置(MICRO_11为数据库名称): db2 get db cfg for MICRO_11 运行结果: 日志文件大小(4KB) (LOG ...
- python_字符串常用方法
1.切片就是通过索引(索引:索引:步长)截取字符串的一段,形成新的字符串(原则就是顾头不顾腚). a = 'ABCDEFGHIJK' print(a[0:3]) # print(a[:3]) 从开头开 ...
- PID28 [Stupid]愚蠢的宠物
题链:https://www.rqnoj.cn/problem/28 题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只 ...
- Codeforces 805 D Minimum number of steps
题意: 给定一串字符串,将所有“ab”的子串替换为“bba”,询问多少次操作后没有子串“ab”. 分析: 观察可得,将“ab”替换为“bba”有两种结果. ①a移到了b的后面 ②增加了一个b 而且最终 ...
- C51 独立按键 个人笔记
独立按键类似于一个开关,按下时开关闭合 防抖 硬件防抖 软件防抖 通过延时,滤掉抖动的部分 电路图 普中科技的开发板,独立按键电路图如下 判断按键按下 因此判断是否按下开关的方法是看引脚是否为低电平( ...
- C语言判断一个数能否被3和5整除
#include <stdio.h> /* 判断一个数能不能同时被3和5整除 --------soulsjie 20170525----- */ void main(){ int inpu ...
- 九度oj 题目1075:斐波那契数列
题目1075:斐波那契数列 时间限制:5 秒 内存限制:32 兆 特殊判题:否 提交:3641 解决:2100 题目描述: 编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的 ...
- JavaEE JDBC 怎么加载驱动
JDBC怎么加载驱动 @author ixenos 分析 1.JDBC是一套连接数据库的接口(放在java.util.sql.Driver类中),不同的数据库依此接口各自实现Java连接到数据库的操作 ...
- 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)
题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...
- ajax分页查询信息的通用方法
1.页面准备分页的表格与分页div 同时需要在查询条件表单中准备隐藏当前页与页大小的文本框 <div class="container-fluid"> <div ...