Entity Framework with MySQL 学习笔记一(继承)
基本上sql中要表示继承关系有3中方式.
分别是,1表继承(TPH),2表继承(TPC),3表继承(TPT)
1表 :
Person
id type name classroom office
1 student keat 1B null
2 teacher xinyao null Lv2-T2
好处是不用 inner join 快,坏处是null 很多,浪费空间, column很长不好看。
2表:
这个很瞎不要学 .. , 大概就是没有父表,字表很多,但是每个column都重复写...无言
3表: (3只是代号,其实是看子类多少就多少表,子表的 id 是跟父表一样的)
Person
id name
Student
id classroom
Teacher
id office
这样就没有null了,只是要inner join 会慢
entity 是用 Fluent API 来实现的
3表方式
[Table("person")]
public class Person
{
[Key]
public Int32 id { get; set; }
public string name { get; set; }
}
//子类不要写 [table("")]public class Student : Person
{
public string classroom { get; set; }
}public class Teacher : Person
{
public string office { get; set; }
}
Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>(). //对Person
Map<Student>(s => s.ToTable("student")). //map 另外2个table , "student" 是tableName
Map<Teacher>(t => t.ToTable("teacher"));
base.OnModelCreating(modelBuilder);
}
insert 的话直接实例化字类就可以了
db.students.Add(new Student
{
name = "keatkeat",
classroom = "1B"
});
db.SaveChanges();
1表方式 :
[Table("person")]
public class Person
{
[Key]
public Int32 id { get; set; }
public string name { get; set; }
//publick string type {get ;set;} //这里是不可以这样写的,type是entity 和 sql 秘密沟通用的
}
/*
子类千万不要写 [Table()] 了
*/
public class Student : Person
{
public string classroom { get; set; }
}
public class Teacher : Person
{
public string office { get; set; }
}
Fluent API
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Map<Student>(s => s.Requires("type").HasValue("student"))
.Map<Teacher>(m => m.Requires("type").HasValue("teacher"));
base.OnModelCreating(modelBuilder);
}
属性 type 是 sql 和 EF 秘密沟通的值,我们是不能获取的。
在获取数据或者做过滤的时候
var commentss = db.users.OfType<Salesman>().Where(s => s.salesmanSpecialColumn == "abc").ToList();
var comments = db.comments.Where(c => c.user is Salesman && (c.user as Salesman).salesmanSpecialColumn == "abc").ToList();
主要是用了 OfType , is , as 来强转
另外 WebAPI 2 , OData v4 的 request url 是这样写的 :
/api/comments?$filter=user/EFDB.Salesman/salesmanSpecialColumn eq 'abc'
for expand : /api/Singles?$expand=abstracts($expand=EFDB.AA/childs)
另外, TPT 虽然比较 OO 不过也常出现Bug,尤其是你的继承很深很宽.
TPT还有个坏处就是 join 表会很慢 。
TPT 在做 checkconcurrent 时要注意,最好在基表加一个rowVersion column , 在 saveChanges 时set 这个column to isModified , 不然并出来的语句会有问题的。
所以通常我们还是会使用 TPH 来做项目
TPH 也是有问题的,虽然select不用Join,
nullable 引起的问题 :浪费空间,sql table 不好看 , 对索引不利 , 不能强制验证不能为null.
(For MSSQL)
此外nullable也不方便set UNIQUE (虽然可以用 filter fix)
还有一种是类的继承 (完全没有写 data annotations vs fluent api)
它表示在所有表都有这个基类的属性
通常我们可以用来做 rowVersion , lastModified, createDatetime 这类基本的东西。
需要注意的是如果有 creator_id (比如记入administrator_id) 遇到有关联的表有些情况要使用 [InverseProperty("administrator")] 来指定哦 ! 我之前就是被这个坑了一下。
还有这种继承不能放在抽象类上(我没有研究为什么,就有bug). 所以比如有rowVersion 那些,在多层继承的类的最上层基类,直接copy paste 属性进去而不要使用继承.
更新 : 2015-07-11
抽象累被 OData json 化返回到前台,每个资源都会附带一个 "'@odata.type' : '#EFDB.Member'" 来表明它是属于那个子类。
当我们在做 POST,PUT 的时候也是同样的道理,我们要告诉OData 明确的子类类型,不然OData是没有办法判断出来的。所以 POST 的json 也必须含有 "@odata.type" !
更新 : 2015-09-26
类型一但创建了就不能够换了,EF并不支持,比如你想把 Teacher 换成 Student =.=”
Entity Framework with MySQL 学习笔记一(继承)的更多相关文章
- Entity Framework with MySQL 学习笔记一(安装)
声明 : 数据库是Mysql,本人的程度只到会写sql语句(不会储蓄过程), c# 会基本的ADO.NET数据库访问,LINQ基础. 这篇只做个人学习|温习作用. 新手可以参考,也请高手指正错误, ...
- Entity Framework with MySQL 学习笔记一(乐观并发)
在做项目时,通常我们对乐观并发有几种处理模式 1. 告诉用户此数据已被其他人捷足先登,更改了.你就算新一下重来吧. 2.直接把数据覆盖上去,我最大. 3.用被人的数据. 这里给出 code first ...
- Entity Framework with MySQL 学习笔记一(关系整理版)
1-1 设置 //DataAnnotation 1-1 | 1-0 table //SQLtable : member , columns : memberId, name //SQL basic l ...
- Entity Framework with MySQL 学习笔记一(insert,update,delete)
先说说 insert 吧. 当EF执行insert时,如果我们传入的对象是有关联(1对多等)的话,它会执行多个语句 insert到多个表, 并且再select出来填充我们的属性(因为有些column默 ...
- Entity Framework with MySQL 学习笔记一(查看EF和SQL请求日志)
做数据库的一向来都会很注意请求的次数还有语句.这关系到很多性能的问题. 因此在使用EF的时候如果不了解原理很可能会搞出很糟糕的请求. 所以呢,在还没有搞懂EF前最基本的是你得"看得见&quo ...
- Entity Framework with MySQL 学习笔记一(拦截)
参考 : http://msdn.microsoft.com/en-us/data/dn469464.aspx EF 允许我们在发送SQL请求和返回数据时做一些拦截的动作 比如可以自定义写 log , ...
- Entity Framework with MySQL 学习笔记一(验证标签)
直接上代码 [Table("single_table")] public class SingleTable { [Key] public Int32 id { get; set; ...
- Entity Framework with MySQL 学习笔记一(复杂类型 Complex Types)
有时候我们希望在sql一个表里面的column, 一部分被分化成另一个class 典型的例子是 Address 直接看代码: [Table("member")] public cl ...
- Entity Framework with MySQL 学习笔记一(关系)
这一篇说说 EF Fluent API 和 DataAnnotations 参考 : http://msdn.microsoft.com/en-us/data/jj591617.aspx http:/ ...
随机推荐
- 西装定制平台Indochino获$1350万B轮融资 - 国际B2C - 亿邦动力网
西装定制平台Indochino获$1350万B轮融资 - 国际B2C - 亿邦动力网 西装定制平台Indochino获$1350万B轮融资 作者: 韦龑来源: i黑马网2013-03-29 11:05 ...
- Apache-Tika解析PDF文档
通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理PDF格式的文章,如下: package com.mengyao.tika.app; im ...
- Hdu 1856(离散化+并查集)More is better
题意:一些人遵循朋友的朋友也是朋友原则,现在找出最大的朋友圈, 因为人的编号比较大,但是输入的数据最多是10w行,所以可得出最多也就20w人,所以可以进行一下离散化处理,这样数据就会毫无压力 //// ...
- web service1简单的例子用jdk自带的类
1,建立自己的java项目my_service 2,建立包,com.hjg.service 3,创建类: IMyService.java package com.hjg.service; import ...
- IE浏览器下面要实现滤镜(transparent),必须要加filter
遇到的问题是: ie9下面的a标签样式是background-color:transparent;导致链接失效,点不动.这个问题跟IE9及其以下a标签链接加 background-color:tran ...
- postgres中的merge join
目前数据库中的join操作 无非三种 nextloop merge hash 本文分析pg的merge join 不得不说pg真是学习数据库实现的好东西 不愧是学院派 用来教学的 代码写的干净注释清晰 ...
- 自然数e这家伙怎么蹦跶出来的?
自然数e这家伙怎么蹦跶出来的? 之前看过一篇中文介绍自然数e的blog,引起了我的兴趣 原文是阮一峰大牛(我认为必须很有必要尊敬的称,大牛)嚼烂了吐出来的哈哈,只是我认为还是自己去看原文比較好 感觉非 ...
- 数字信号处理Day2-小波基与规范正交化
我们有这么一张灰度图64*64 我们能够定义出4096个基,各自是某一位是0其它是1,在这样的情况下,假设我们传输图片,那么就相当于传输原始数据 如果传到一半,网络坏了. 于是,我们得到 我们能够计算 ...
- 关于PHP的curl开启问题 (转)
今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...
- 再探Java基础——String.format(String format, Object… args)的使用
最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如 ...