Entity Framework Code First 中使用 Fluent API 笔记。
在做MVC+EF CodeFirst 的Demo时,碰到的问题,
在组册用户时,要让用户输入确认密码,但是数据库中又不需要保存这个字段,解决方案很多了,这里我列出通过EF Code First的解决方案。
UserInfo实体
public class UserInfoModel
{
[UIHint("HiddenInput")]
public int UserId { get; set; }
[Display(Name = "用户名")]
public string UserName { get; set; }
[Display(Name = "密码")]
[DataType(DataType.Password)]
public string UserPwd { get; set; }
[Display(Name = "确认密码")]
[DataType(DataType.Password)]
public string ConfirmUserPwd { get; set; } public string Email { get; set; }
public DateTime RegisterDate { get; set; }
[Display(Name = "备注")]
public string Memo { get; set; }
public virtual RoleInfoModel Role { get; set; }
}
//UserInfo的Fluent API 配置类
public class UserInfoConfiguration : EntityTypeConfiguration<UserInfoModel>
{
public UserInfoConfiguration()
{
HasKey(c => c.UserName);
Property(c => c.UserId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //通过Map也可以忽略
//Map(l =>
//{
// l.Properties(x => new { x.UserId, x.UserName, x.UserPwd, x.Email, x.RegisterDate, x.Memo }); //}); Ignore(c => c.ConfirmUserPwd); //忽略这个属性
}
}
关于EntityTypeConfiguration<TModel>.Map(),这个方法很强大。
定义:
public class EntityTypeConfiguration<TEntityType> : StructuralTypeConfiguration<TEntityType> where TEntityType : class
{
//……省略N行
public EntityTypeConfiguration<TEntityType> Map(Action<EntityMappingConfiguration<TEntityType>> entityMappingConfigurationAction); //…… }
具体使用在以下5个方面:
1.可以实现同一个实体映射到不同的表,也就是分割实体。
现有StudentInfo实体类如下:
public class Student
{
public Student()
{ }
public string StudentId { get; set; }
public string StudentName { get; set; }
public bool Sex { get; set; }
public DateTime Birthday { get; set; }
public string Email { get; set; }
public string QQ { get; set; }
public string MobilePhone { get; set; }
public string FixedPhone { get; set; }
public byte[] Photo { get; set; }
}
public class StudentConfig : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Student>
{
public StudentConfig()
{
HasKey(c => c.StudentId);
Map(c =>
{
c.Properties(l => new { l.StudentName, l.Sex, l.QQ, l.FixedPhone, l.MobilePhone });
c.ToTable("StudentBasicInfo");
});
Map(c =>
{ c.Properties(l => new { l.Photo });
c.ToTable("StudentPhoto");
});
}
}
生成的数据库表:
2.可以实现多个实体映射到同一个表。
现有student和studentphoto实体类:
public class Student
{
public Student()
{ }
public string StudentId { get; set; }
public string StudentName { get; set; }
public bool Sex { get; set; }
public DateTime Birthday { get; set; }
public string Email { get; set; }
public string QQ { get; set; }
public string MobilePhone { get; set; }
public string FixedPhone { get; set; }
public StudentPhoto Photo { get; set; }
} public class StudentPhoto
{
public string StudentId { get; set; }
public byte[] Photo { get; set; }
public Student student { get; set; }
}
public class StudentConfig : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Student>
{
public StudentConfig()
{
HasKey(c => c.StudentId);
HasRequired(c => c.Photo).WithRequiredDependent(c => c.student);
ToTable("student");
}
}
public class StudentPhotoConfig : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<StudentPhoto>
{
public StudentPhotoConfig()
{
HasKey(c => c.StudentId);
ToTable("student");
}
}
要实现这个功能要注意以下几点:
1.实体之间要有一对一的关系(实体中绿色字体)2.实体之间要有完全相同的主键(实体中红色字体)3.配着类中要指明一对一的关系(StudentConfig 类中红色字体)4.相同的表名。(ToTable("student");)
生成的数据库表:
3.可以实现每个层次结构一张表 (TPH) 继承
4.可以实现每个类型一张表 (TPT) 继承
5.可以实现每个具体类型一张表 (TPC) 继承
Entity Framework Code First 中使用 Fluent API 笔记。的更多相关文章
- Entity Framework(七):Fluent API配置案例
一.配置主键 要显式将某个属性设置为主键,可使用 HasKey 方法.在以下示例中,使用了 HasKey 方法对 Product 类型配置 ProductId 主键. 1.新加Product类 usi ...
- Entity Framework Code First实体对象变动跟踪
Entity Framework Code First通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理. 变动跟踪快照:前面 ...
- Entity Framework Code First 学习日记(1)精
我最近几天正在学习Entity Framework Code First.我打算分享一系列的学习笔记,今天是第一部分: 为什么要使用Code First: 近 年来,随着domain driven d ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- How to: Use the Entity Framework Code First in XAF 如何:在 XAF 中使用EF CodeFirst
This topic demonstrates how to create a simple XAF application with a business model in a DbContext ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- Entity Framework Code First关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Entity Framework Code First (三)Data Annotations
Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...
- Entity Framework Code First (二)Custom Conventions
---------------------------------------------------------------------------------------------------- ...
随机推荐
- MVC与WebForm的区别
在初步了解MVC后,发现很多人对于MVC和三层架构开发概念上会有很大的混淆,所以把这两天的学习笔记整理一下,分享给自己的同学们.同时也做一个小Demo,让没有接触过MVC开发的同学,能对MVC有一个简 ...
- PHP 数据访问
如何连接 1.造连接对象 $db= new MySQLi("localhost","root","123","mydb" ...
- Hexo的Next主题配置
使用Next主题 在这里Downloads Next主题代码 将下载的代码放在myBlog/next目录下 设置站点myBlog/_config.yml的theme字段值为next 生成新页面hexo ...
- 【非愚人】重要通知:04-01 贴吧继PHP资源之后又。。。
贴吧继PHP资源之后又取消了JAVA,IOS等资源的贴,现在专注于Net,C++,Linux,平面设计.主要是为了让广大Net程序员具备全栈全平台牛人的潜力,故而取消那些干扰因素.Net的潜力和活力大 ...
- SQL Server 堆表行存储大小(Record Size)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 堆表行记录存储格式(Heap) 案例分析(Case) 参考文献(References) 二.背 ...
- html5的audio在safari(windows)中无效
因为mac下的safari不会有这样的问题(OSX默认都装的有QuickTime),而windows下用safari的比例实在小不用考虑. apple算是偷了一个小懒.而所谓的需要quicktime并 ...
- 深入理解DOM事件类型系列第二篇——键盘事件
× 目录 [1]类型 [2]顺序 [3]按键信息[4]应用 前面的话 鼠标和键盘是电脑端主要的输入设备,上篇介绍了鼠标事件,本文将详细介绍键盘事件 类型 键盘事件用来描述键盘行为,主要有keydown ...
- android5.0联系人 sort_key改成phonebook_label
项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...
- OO中,先有对象还是先有类?
就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...
- vue-lazy-render: 延迟渲染大组件,增强页面切换流畅度
最近用element来做项目,在开发的过程中,突然发现页面的操作和切换在数据量大的时候相当卡,后来提了个issue,在furybean解答后才知道,我每个单元格都加了tooltip,会生成大量的节点, ...