Code First:Data Anotation (2)
示例一
本例演示与索引有关的内容,模型:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace DataAnnotations
{
public class Post
{
public int Id { get; set; }
public string Title { get; set; } [Index("PostRatingIndex")]
public int BlogId { get; set; }
} public class User
{
public int UserId { get; set; } [Index(IsUnique = true)]
[StringLength(200)]
public string Username { get; set; } public string DisplayName { get; set; }
} public class Cell
{
public int Id { get; set; }
public string Content { get; set; } [Index("IX_Location", 1, IsUnique = true)]
public int Row { get; set; } [Index("IX_Location", 2)]
[StringLength(5)]
public string Column { get; set; }
}
}
生成的数据库表代码为:
------------------------------------------
CREATE TABLE [dbo].[Posts] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
CREATE NONCLUSTERED INDEX [PostRatingIndex] ON [dbo].[Posts]([BlogId] ASC);
GO ------------------------------------------
CREATE TABLE [dbo].[Users] (
[UserId] INT IDENTITY (1, 1) NOT NULL,
[Username] NVARCHAR (200) NULL,
[DisplayName] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ([UserId] ASC)
);
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Username]
ON [dbo].[Users]([Username] ASC);
GO ------------------------------------------
CREATE TABLE [dbo].[Cells] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Content] NVARCHAR (MAX) NULL,
[Row] INT NOT NULL,
[Column] NVARCHAR (5) NULL,
CONSTRAINT [PK_dbo.Cells] PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Location]
ON [dbo].[Cells]([Row] ASC, [Column] ASC);
GO
Post类演示了在BlogId上定义一个名为PostRatingIndex的索引。
User类演示了如何定义一个唯一索引,注意这里没有指定索引的名称,系统按照格式IX_PropertyName生成索引名称。
Cell类演示多列索引,给每个列指定相同的名称,如果有索引选项要修改,只需要在第一个属性上指定。
对字符串string类型的属性建立索引,需要指定其长度,长度不能大于某个值。
示例二
本例演示外键,模型代码:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace DataAnnotations
{
public class Blog
{
[Key]
public int PrimaryKey { get; set; } public string Title { get; set; } //导航属性
public virtual ICollection<Post> Posts { get; set; }
} public class Post
{
public int Id { get; set; }
public string Content { get; set; } //外键
public int BlogId { get; set; } //导航属性
[ForeignKey("BlogId")]
public Blog Blog { get; set; }
}
}
这里,Blog的主键没有遵守主键的命名约定,在Post类的导航属性Blog上指定外键属性,其参数"BlogId"指的是Post类成员BlogId是外键列。
生成的数据库代码:
-----------------------------------------------------------------------------------------
CREATE TABLE [dbo].[Blogs] (
[PrimaryKey] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([PrimaryKey] ASC)
); -----------------------------------------------------------------------------------------
CREATE TABLE [dbo].[Posts] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Content] NVARCHAR (MAX) NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([PrimaryKey]) ON DELETE CASCADE
); GO
CREATE NONCLUSTERED INDEX [IX_BlogId]
ON [dbo].[Posts]([BlogId] ASC);
EF框架默认为外键列添加索引,以加快检索速度。
现在,将Post类中的ForeignKey标记从导航属性移动到外键属性上,微调代码:
public class Post
{
public int Id { get; set; }
public string Content { get; set; } //外键
[ForeignKey("MyBlog")]
public int BlogId { get; set; } //导航属性
public Blog MyBlog { get; set; }
}
再次查看生成的数据库表:
CREATE TABLE [dbo].[Posts] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Content] NVARCHAR (MAX) NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([PrimaryKey]) ON DELETE CASCADE
); GO
CREATE NONCLUSTERED INDEX [IX_BlogId]
ON [dbo].[Posts]([BlogId] ASC);
可见生成的代码是一样的,由此可见,外键标记就是在依赖表中建立外键属性与导航属性之间对应关联的。
示例三
本示例演示反转属性注解,此注解用于两个实体间有多个关系的情况,如一个文档有创建者,有更新者,这两者都是人。此时如下定义模型:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace DataAnnotations
{
public class Person
{
public int Id { get; set; }
[Index(IsUnique =true),StringLength()]
public string Name { get; set; } //导航属性
[InverseProperty("CreatedBy")]
public List<Document> CreatedDocuments { get; set; } [InverseProperty("UpdatedBy")]
public List<Document> UpdatedDocuments { get; set; }
} public class Document
{
public int Id { get; set; }
public string Content { get; set; } //导航属性
public Person CreatedBy { get; set; }
public Person UpdatedBy { get; set; }
}
}
在Person类的CreatedDocuments上有标记[InverseProperty("CreatedBy")],并且此属性是Document类型的集合,则可以翻译成Person类的CreatedDocuments导航属性是Document类的CreatedBy导航属性的反属性。
下面是生成的数据库:
CREATE TABLE [dbo].[People] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NULL,
CONSTRAINT [PK_dbo.People] PRIMARY KEY CLUSTERED ([Id] ASC)
); GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Name]
ON [dbo].[People]([Name] ASC); --------------------------------------------------------------------------------------
CREATE TABLE [dbo].[Documents] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Content] NVARCHAR (MAX) NULL,
[CreatedBy_Id] INT NULL,
[UpdatedBy_Id] INT NULL,
CONSTRAINT [PK_dbo.Documents] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Documents_dbo.People_CreatedBy_Id] FOREIGN KEY ([CreatedBy_Id]) REFERENCES [dbo].[People] ([Id]),
CONSTRAINT [FK_dbo.Documents_dbo.People_UpdatedBy_Id] FOREIGN KEY ([UpdatedBy_Id]) REFERENCES [dbo].[People] ([Id])
); GO
CREATE NONCLUSTERED INDEX [IX_CreatedBy_Id]
ON [dbo].[Documents]([CreatedBy_Id] ASC); GO
CREATE NONCLUSTERED INDEX [IX_UpdatedBy_Id]
ON [dbo].[Documents]([UpdatedBy_Id] ASC);
EF在外键表Documents中生成外键列的名字为:导航属性_Id。
Code First:Data Anotation (2)的更多相关文章
- Code First :使用Entity. Framework编程(2) ----转发 收藏
第二章:Code First概览 如果你使用第一.二版的EF框架工作过,你会回想起书中的业务案例:Break Away Geek Adventures, 简称BAGA.BAGA共享了很多像我们这样的奇 ...
- Code First :使用Entity. Framework编程(1) ----转发 收藏
这个是在学习EF CodeFirst时发现的,对于初学者还是不错的.果断转发,方便自己以后查阅和学习. 对于学习Code First 这个教程讲解的还是很详细. 第一章:欢迎来到Code First ...
- Code First:Fluent API
DbContext类有一个OnModelCreating方法,可以在这里配置模型,该方法接收一个类型为DbModelBuilder的建造者,本文介绍的为Data Anotation的等价方法,这些代码 ...
- 异常:Data = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。
做项目的时候,将DataTable序列化成Json,通过ashx向前台返回数据的时候,前台总是获取不到数据,但是程序运行却没问题, 没抛出异常.一时找不到办法,减小输出的数据量,这时前台可以接收到页面 ...
- lombok插件:Data自动get/set方法, Slf4j实现Logger的调用
lombok插件:Data自动get/set方法, Slf4j实现Logger的调用 lombok.Data import lombok.Data; import org.hibernate.anno ...
- 插入图片新方式:data:image
我们在使用<img>标签和给元素添加背景图片时,不一定要使用外部的图片地址,也可以直接把图片数据定义在页面上.对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入. 如何使用 ...
- EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...
- Logstash:Data转换,分析,提取,丰富及核心操作
Logstash:Data转换,分析,提取,丰富及核心操作 Logstash plugins Logstash是一个非常容易进行扩张的框架.它可以对各种的数据进行分析处理.这依赖于目前提供的超过200 ...
- Mysql load data infile 导入数据出现:Data truncated for column
[1]Mysql load data infile 导入数据出现:Data truncated for column .... 可能原因分析: (1)数据库表对应字段类型长度不够或修改为其他数据类型( ...
随机推荐
- Python:webshell 跳板机审计服务器
1.修改paramiko源码包实现 https://github.com/paramiko/paramiko/tree/1.10.1 下载源码包 unzip paramiko-1.10.1.zip p ...
- linux下安装flash player
下载flash player,选择.tar.gz for other linux. 网址:http://get.adobe.com/flashplayer/ Ctrl+Alt+T进入终端: 进入下载所 ...
- Error: Divergence detected in AMG solver: k
** Error: Divergence detected in AMG solver: k A:Since you were working on convergence issue from pa ...
- 【Codeforces 1041D】Glider
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 二分. 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) ...
- Rsync文件同步服务器配置
rsync 是一个Unix/Linux系统下的文件同步和传输工具.rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法.可以用来做备份或镜像.一.配置文件rsync ...
- 【裸的并查集】POJ 1611 The Suspects
http://poj.org/problem?id=1611 [Accepted] #include<iostream> #include<cstdio> #include&l ...
- MeepoPS基本使用方法
MeepoPS基本使用 MeepoPS是Meepo PHP Socket的缩写. 旨在提供高效稳定的由纯PHP开发的多进程SocketService. MeepoPS可以轻松构建在线实时聊天, 即时游 ...
- codeforces Gym 100814 A、B、F、I
A题 先求出来这个数是第几大 阶乘求概率p 然后计算获得胜率的概率 常规解法把所有情况考虑一遍(跳1次,2次,3次……)要用到组合数 数可能太大了会爆的行不通 我们观察发现它有递推性质,从第二大 ...
- UEFI 下安装 ubuntu 及 win8 双系统 的一些事
给电脑原装的win8系统装Ubuntu 出现了好多问题,重装多次,刷坏一块主板后,(都是泪啊...) 终于成功. 可能的问题 1:win8 系统下进入 blos 解决方案 1)关闭快速启动:管理员命 ...
- MongoDB使用教程收集(语法教程)
https://www.tutorialspoint.com/mongodb/index.htm https://wizardforcel.gitbooks.io/w3school-mongodb/c ...