示例一

本例演示与索引有关的内容,模型:

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)的更多相关文章

  1. Code First :使用Entity. Framework编程(2) ----转发 收藏

    第二章:Code First概览 如果你使用第一.二版的EF框架工作过,你会回想起书中的业务案例:Break Away Geek Adventures, 简称BAGA.BAGA共享了很多像我们这样的奇 ...

  2. Code First :使用Entity. Framework编程(1) ----转发 收藏

    这个是在学习EF CodeFirst时发现的,对于初学者还是不错的.果断转发,方便自己以后查阅和学习. 对于学习Code First 这个教程讲解的还是很详细. 第一章:欢迎来到Code First ...

  3. Code First:Fluent API

    DbContext类有一个OnModelCreating方法,可以在这里配置模型,该方法接收一个类型为DbModelBuilder的建造者,本文介绍的为Data Anotation的等价方法,这些代码 ...

  4. 异常:Data = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    做项目的时候,将DataTable序列化成Json,通过ashx向前台返回数据的时候,前台总是获取不到数据,但是程序运行却没问题, 没抛出异常.一时找不到办法,减小输出的数据量,这时前台可以接收到页面 ...

  5. lombok插件:Data自动get/set方法, Slf4j实现Logger的调用

    lombok插件:Data自动get/set方法, Slf4j实现Logger的调用 lombok.Data import lombok.Data; import org.hibernate.anno ...

  6. 插入图片新方式:data:image

    我们在使用<img>标签和给元素添加背景图片时,不一定要使用外部的图片地址,也可以直接把图片数据定义在页面上.对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入. 如何使用 ...

  7. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

    目录 1. 数据转换概念 2. 数据智能感知 - DataSense 3. 简单数据转换组件 3.1 Object to JSON 3.2 JSON to XML 3.3 JSON to Object ...

  8. Logstash:Data转换,分析,提取,丰富及核心操作

    Logstash:Data转换,分析,提取,丰富及核心操作 Logstash plugins Logstash是一个非常容易进行扩张的框架.它可以对各种的数据进行分析处理.这依赖于目前提供的超过200 ...

  9. Mysql load data infile 导入数据出现:Data truncated for column

    [1]Mysql load data infile 导入数据出现:Data truncated for column .... 可能原因分析: (1)数据库表对应字段类型长度不够或修改为其他数据类型( ...

随机推荐

  1. Kvm:启动报错:error: internal error: process exited while connecting to monitor: 2018-11-12T01:47:14.993371Z qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

    今天有台kvm挂了,物理机启动时报错 很明显看报错显示内存不足,无法分配内存,查看物理机内存使用正常,.xml修改虚机内存后启动依然报错 报错: 这时候需要看一下主机确保可以分配多少内存 sysctl ...

  2. restframework框架之认证

    1. 认证之APIView 在聊APIView之前, 我们先重温一下django2.x的CBV流程 a. 对于django而言, 当浏览器请求到达之后,按照规则首先会经过各大中间件(Middlewar ...

  3. 全国高校json数据包(复python解析代码)

    由于这段时间需要有关学校的三级联动插件,找了很久没有找到合适的,所以去教育部官网下载了一份全国普通高校名单(2019年), 这里附上解析该xls文件的代码 import xlrd import jso ...

  4. 输出一定范围unicode对应符号

    #本程序没有考虑对0x的处理,请勿输入,直接输入16进制位即可 begin = input("起始点:") end = input("结束点:") b_int0 ...

  5. 零基础入门Python数据分析,只需要看懂这一张图,附下载链接!

    摘要 在做数据分析的过程中,经常会想数据分析到底是什么?为什么要做数据数据分析?数据分析到底该怎么做?等这些问题.对于这些问题,一开始也只是有个很笼统的认识. 最近这两天,读了一下早就被很多人推荐的& ...

  6. 将文件大小kb转换成M

    得到文件的大小的一般是直接到得到的是文件的字节大小,也就是kb,我们有的时候需要做单位换算成B或者M, 下面方法只是换成M,没有到G, 有更好的方法,请随时沟通,以便交流学习,谢谢. public s ...

  7. Git和SVN共存的方法

    刚工作的时候都是用的cvs和svn,对git不熟悉,随着工作的需要,打分支和版本管理的需要,熟悉起来了git,这一用不可收拾,比svn远远好用,尤其是版本分支管理上,切换分支的方便性,现在这家公司还是 ...

  8. tyvj1031 热浪

    背景 USACO OCT09 9TH 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先 ...

  9. 2015山东信息学夏令营 Day4T3 生产

    2015山东信息学夏令营 Day4T3 生产 [题目描述] 工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划.那么,就经常会有生产部门要把产品送到另一个生产部门作为原料.这是一个注重产品 ...

  10. Linux下汇编语言学习笔记66 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...