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)数据库表对应字段类型长度不够或修改为其他数据类型( ...
随机推荐
- mui.openWindow的html5+和web传参的兼容
mui.openWindow兼容web&plus环境下的页面传参 背景介绍 刚刚好要写个微信公众号和html5+兼容的项目 发现总是用localStorage传参不是事啊 太不优雅了 想了想还 ...
- *****Python之进程线程*****
Python之进程线程 Python的threading模块 并发编程: 操作系统:位于底层硬件与应用软件之间的一层. 工作方式:向下管理硬件,向上提供接口. 进程:资源管理单位(容器) 线程:最 ...
- STM32F407 正点原子 资料网址记录
网络资源 资源下载: http://www.openedv.com/thread-13912-1-1.html (注意下载资料的版本!非常推荐腾讯视频,因为可以在线免费倍速播放.课件ppt可以单独下载 ...
- [luoguP1472] 奶牛家谱 Cow Pedigrees(DP)
传送门 一个深度为i的树可以由一个根节点外加两个深度为i-1的树组成,这就决定了DP该怎么写. 然而我真的没有想到. f[i][j]表示深度为i节点数为j的个数 sum[i][j]表示深度小于等于i节 ...
- POJ 1741 Tree【Tree,点分治】
给一棵边带权树,问两点之间的距离小于等于K的点对有多少个. 模板题:就是不断找树的重心,然后分开了,分治,至少分成两半,就是上限为log 然后一起统计就ok了 #include<iostream ...
- string数据类型操作【四】
keys * 用于查找所有的key值 exists mykey #判断该键是否存在,存在返回1,否则返回0. del mykey 删除键(存在就删除返回1,不存在返回为0) ...
- Spring boot精要
1.自动配置:针对很多Spring应用程序的常见应用功能,SpringBoot能自动提供相关配置: 2.起步依赖:告诉SpringBoot需要什么功能,他就能引入需要的库: 3.命令行界面:这是Spr ...
- mybatis collection标签和association标签(一对多,一对一)转载
mybatis 一对一与一对多collection和association的使用 在mybatis如何进行一对一.一对多的多表查询呢?这里用一个简单的例子说明. 一.一对一 1.associati ...
- vue watch 深度监控
比如监控 data中的list
- 【Unix编程】C/C++获取目录下文件或目录
在Unix/Linux系统中,要获取一个指定目录下所有的文件或文件夹,一般用dirent.h(POSIX标准定义的目录操作头文件). 一.数据类型 在头文件<dirent.h>中定义了两种 ...