Programming Entity Framework CodeFirst -- 约定和属性配置
|
Data Annotation
|
MinLength(nn)
MaxLength(nn)
StringLength(nn)
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName).HasMaxLength(nn)
|
在SQL Server中,string会转换为nvarchar(max),bit会转换为varbinary(max) 如果是SQL CE这里的最大值会变成4000(毕竟人家是嵌入式数据库). 通过MinLength等来限制字段在数据库中的长度。MinLength和MaxLength会受到EntityFramework的验证,不会影响到数据库。
[StringLength(,MinimumLength= )]
public string Description { get; set; }
Data Type
|
Data Annotation
|
Column(TypeName=“xxx”)
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName)
.HasColumnType (“xxx”)
|
[Column(TypeName = "image")]
public byte[] Photo { get; set; }
Nullability
|
Data Annotation
|
Required
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName).IsRequired
|
[Required]
public string Name { get; set; }
Keys
|
Data Annotation
|
Key
|
|
Fluent
|
Entity<T>.HasKey(t=>t.PropertyName)
|
EF需要每个实体必须拥有一个Key,context会根据key来跟踪对象。而且默认是自动递增的。
Database-Generated
|
Data Annotation
|
DatabaseGenerated(DatabaseGeneratedOption)
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption)
|
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DestinationId { get; set; }
DatabaseGeneratedOption 为None可以关闭自动增加。 TimeStamp或RowVersion
|
Data Annotation
|
TimeStamp
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName).IsRowVersion()
|
timestamp和rowversion是同一个数据类型的不同叫法,不同的数据库显示不同
[Timestamp]
public byte[] RowVersion { get; set; }
时间戳:数据库中自动生成的唯一二进制数字,与时间和日期无关的, 通常用作给表行加版本戳的机制,当行数据发生修改,时间戳会自动增加。存储大小为 8个字节。一个表只有一个时间戳列,不适合做主键,因为其本身是变化的。
在控制并发时起到作用:
用户A/B同时打开某条记录开始编辑,保存是可以判断时间戳,因为记录每次被更新时,系统都会自动维护时间戳,所以如果保存时发现取出来的时间戳与数据库中的时间戳如果不相等,说明在这个过程中记录被更新过,这样的话可以防止别人的更新被覆盖.
Non-Timestamp for Concurrency
|
Data Annotation
|
ConcurrencyCheck |
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName).IsConcurrencyToken() |
对于那些没有时间戳的数据库中也提供并发检查。避免造成同时修改造成的冲突。和上面的Timestamp一样,当模型发生改变写入到数据库的时候,数据库不但通过key找到了这一行数据,还会比对标记了Concurrency字段的值是否是原来的值。
public class Person
{
public int PersonId { get; set; }
[ConcurrencyCheck]
public int SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
} //....
private static void UpdatePerson()
{
using (var context = new BreakAwayContext())
{
var person = context.People.FirstOrDefault();
person.FirstName = "Rowena";
context.SaveChanges();
}
}
SQL:
exec sp_executesql N'update [dbo].[People]
set [FirstName] = @0
where (([PersonId] = @1) and ([SocialSecurityNumber] = @2))
',N'@0 nvarchar(max) ,@1 int,@2 int',@0=N'Rowena',@1=1,@2=12345678
Non-Unicode Database Types
|
Data Annotation
|
unavailable
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName).IsUnicode(boolean)
|
Property(l => l.Owner).IsUnicode(false);
默认情况下,所以string都会映射成数据库中的Unicode类型。data Annotation 不支持。
Precision and Scale of Decimals
精度定义:
|
Data Annotation
|
unavailable
|
|
Fluent
|
Entity<T>.Property(t=>t.PropertyName).HasPrecision(n,n)
|
Property(l => l.MilesFromNearestAirport).HasPrecision(, );
上面表示MilesFromNearestAirport是八位数,保留一位小数。data Annotation 不支持。
complex type
Complex Type需要满足3个条件:1.没有key(Id),2.complex类型只能包含原始属性(primitive properties),3.当它用到别的类中时,只能是非集合(non-collection)形式。
下面的Address就是一个complex type
public class Address
{
//public int AddressId { get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public int SocialSecurityNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
生成的表如下。

[ComplexType]
public class Address
{
public int AddressId { get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
Api :
modelBuilder.ComplexType<Address>().Property(p => p.StreetAddress).HasMaxLength();
More Complicated Complex Types
public class PersonalInfo
{
public Measurement Weight { get; set; }
public Measurement Height { get; set; }
public string DietryRestrictions { get; set; }
}
public class Measurement
{
public decimal Reading { get; set; }
public string Units { get; set; }
} public PersonalInfo Info { get; set; }
Person包含PersonInfo,PersonInfo包含两个Measurement。先在构造函数中初始化:
public Person()
{
Address = new Address();
Info = new PersonalInfo
{
Weight = new Measurement(),
Height = new Measurement()
};
}
这时运行会报错,说PersonInfo 没有定义主键。因为他包含的两个Measurement不是原始类型(primitive types)。


public class AddressConfiguration :
ComplexTypeConfiguration<Address>
{
public AddressConfiguration()
{
Property(a => a.StreetAddress).HasMaxLength();
}
}
再在OnModelCreating方法中加入
modelBuilder.Configurations.Add(new AddressConfiguration());
Programming Entity Framework CodeFirst -- 约定和属性配置的更多相关文章
- 【读书笔记】Programming Entity Framework CodeFirst -- 初步认识
以下是书<Programming Entity Framework Code First>的学习整理,主要是一个整体梳理. 一.模型属性映射约定 1.通过 System.Component ...
- Entity Framework 系统约定配置
前言 Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来越复杂,大家都试图将软件设计的越来越灵活,很多内容我们都希望是可配 ...
- Entity Framework Codefirst的配置步骤
Entity Framework Codefirst的配置步骤: (1) 安装命令: install-package entityframework (2) 创建实体类,注意virtual关键字在导航 ...
- 第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用
上一篇 第二篇:Entity Framework CodeFirst & Model 映射 主要介绍以Fluent API来实作EntityFramework CodeFirst,得到了大家一 ...
- 第二篇:Entity Framework CodeFirst & Model 映射
前一篇 第一篇:Entity Framework 简介 我有讲到,ORM 最关键的 Mapping,也提到了最早实现Mapping的技术,就是 特性 + 反射,那Entity Framework 实现 ...
- Entity Framework CodeFirst数据迁移
前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual ...
- [Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)
http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可 ...
- entity framework codefirst 用户代码未处理DataException,InnerException基础提供程序在open上失败,数据库生成失败
警告:这是一个入门级日志,如果你很了解CodeFirst,那请绕道 背景:这篇日志记录我使用Entity FrameWork CodeFirst时出现的错误和解决问题的过程,虽然有点曲折……勿喷 备注 ...
- ADO.NET Entity Framework CodeFirst 如何输出日志(EF 5.0)
ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用的EFProviderWrappers ,这个组件好久没有更新了,对于SQL执行日志的解决方案的需求 ...
随机推荐
- HTTP协议-----小白
HTTP是一个属于应用层的面向对象的协议. ***OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 HTTP协议的主要特点可概括如下: ...
- configure: error: *** libpopt not found 解决方法
ubuntu (deb) $ apt-cache search popt|headlibpopt-dev - lib for parsing cmdline parameters - developm ...
- Java LinkedList 源码剖析
LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack).这样看来,LinkedList简直就 ...
- Spring整合MyBatis
前言:MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的XML或注解用 ...
- ArcGIS Js/Flex等前端API(Query(StatisticDefinition)时)针对SDE的SHAPE.AREA/SHAPE.LEN知道查询无效,而对GDB的SHAPE_Area/SHAPE_Length有效探索。
FIeld 'SHAPE.AREA' and 'SHAPE.LEN' of SDE For Oracle,Field 'SHAPE_Area' and 'SHAPE_Length' of gdb(ge ...
- label下面放置select的问题
今天做项目的时候突然发现一个问题. html标签label的用法分两种: <label for="name">姓名:</label><input id ...
- 算法入门笔记------------Day2
1.开灯问题 有n盏灯,编号为1-n,第一个人把所有灯打开,第二个按下所有编号为2的倍数的开关(这些灯都被关掉),第三个人按下所有编号为3的倍数的开关,依次类推,一共有k个人,问最后有哪些灯开着?输入 ...
- EDA技术与ASIC设计和FPGA开发有什么关系?FPGA在ASIC设计中有什么用途?
利用EDA技术进行电子系统设计的最后目标是完成专用集成电路ASIC的设计和实现:FPGA和CPLD是实现这一途径的主流器件.FPGA和CPLD通常也被称为可编程专用IC,或可编程ASIC.FPGA和C ...
- 类型“System.Windows.Markup.IUriContext”在未被引用的程序集中定义 解决办法
错误 CS0012: 类型“System.Windows.Markup.IUriContext”在未被引用的程序集中定义.必须添加对程序集“System.Xaml, Version=4.0.0.0, ...
- Mac OS X 安装Win7双系统
Mac10安装双系统 为了有一个纯净的开发环境,就在mac电脑中安装windows虚拟机.刚开始使用还很顺利,两个系统的交互很方便,mac用来下载.搜索和写笔记:windows纯开发.时间长了以后关机 ...