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语句映射成对象属性 ...
随机推荐
- AutoEncoders原理
目录 Auto-Encoders How to Train? Auto-Encoders How to Train?
- django+uwsgi+nginx部署(非常详细)
django+uwsgi+nginx部署 1.介绍: 在网上看了很多教程,但自己部署了很久都没有成功,这篇博文记录自己所踩过得坑. 2.环境: Ubuntu 16.04.1 LTS (GNU/Linu ...
- LeetCode(59)SPiral Matrix II
题目 Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. F ...
- python基础示例
7.写代码 (1)实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败! _name = "seven" _pwd = " ...
- Webbrowser 在web项目中的使用
string htmlstr = string.Empty; [STAThread] public string GetHtmlByWeb(string url) { try { RunWithSin ...
- pip提示Did not provide a commend
今天小编想要查看一下自己安装的pip版本,并且使用pip查看selenium版本等,结果在cmd输入pip,提示Did not provide a commend,如下所示: 在网上查询了很多方法,比 ...
- JQuery_九大选择器
JQuery_九大选择器-----https://blog.csdn.net/pseudonym_/article/details/76093261
- 【NOIP2017练习】鏖战字符串(斜率优化DP)
题意: 在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除.“量子态的字符串”的每个字符都有一个删除难度dif[i].“量子态的字符串”非常顽固,只能先分割成若 ...
- gradle 安装及设置本地仓库地址
进入地址:http://services.gradle.org/ 下载-bin.zip 解压到自己指定的目录. 配置环境变量 GRADLE_HOME gradle的根目录. 在path 中 添加 % ...
- 【SQL Server 学习系列】-- 收缩数据库文件大小
USE WebExam; GO ALTER DATABASE WebExam SET RECOVERY SIMPLE; GO -- 收缩文件到 1 MB. ); GO ALTER DATABASE W ...