1、准备工作

Db Frist创建实体数据模型(创建edmx并不是重点,各位随意即可),此处取名ZeroCodeDB,所得文件如图所示;其中红框中的文件(ZeroCodeDB.tt)是各实体的生成的关键代码,即Entity的T4模板文件,本文正是要对此文件动刀

Demo父类代码准备如下,后续文章将会演示如何使实体User继承DemoClass、IDemoInterface<out TKey>。

using System;

namespace ZeroCode.DemoLib
{
public class DemoClass{ } public interface IDemoInterface<out TKey> where TKey : IEquatable<TKey>
{
TKey Id { get; }
}
}

2、分析Entity类名是如何生成的

打开ZeroCodeDB.tt文件,找到Entity的类名生成方法EntityClassOpening()如下方左图所示,对应生成的User实体类名如右图红框所示,即EntityClassOpening()方法生成了字符串 “public partial class User ”,那么只要对该方法进行操作就可以实现我们的目的了。

接下来将从情节假设中演示如何修改Entity的继承关系。

(注:T4模板代码高亮需要安装T4模板编辑器,工具-->扩展和更新-->联机-->搜索“T4 editor”)

情景一:继承某类

情景假设:不需要EF生成的继承关系,将所有实体都继承 ZeroCode.DemoLib.DemoClass

完成上述情景需要两个步骤:

  1. 在ZeroCodeDB.tt代码中添加类库ZeroCode.DemoLib的引用;
  2. 替换 _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),保存运行T4模板。

情景二:实现某泛型接口

情景假设:需要EF生成继承关系的同时并实现IDemoInterface<out TKey>泛型接口,实体主键的类型作为泛型

完成上述情景需要四个步骤:

  1. 在ZeroCodeDB.tt代码中添加类库ZeroCode.DemoLib的引用;
  2. 在TypeMapper类添加一个获取实体主键类型的方法(见下方图2);
  3. 在CodeStringGenerator类添加一个返回实体继承关系的方法(见下方图3);
  4. 替换 _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),保存运行T4模板。

    public string GetEntityInheritString(EntityType entity)
{
string baseTypeName= _typeMapper.GetTypeName(entity.BaseType);
string idType=_typeMapper.GetIdKeyType(entity);
string customBase=string.Format(
CultureInfo.InvariantCulture,
"{0}IDemoInterface<{1}>",
string.IsNullOrEmpty(baseTypeName)?"":",",
idType);
return _code.StringBefore(" : ", baseTypeName + customBase);
} public string GetIdKeyType(EntityType type)
{
if(type.KeyMembers.Count>)
{
EdmMember meb=((EdmMember)type.KeyMembers.FirstOrDefault());
return meb==null?null: GetTypeName(meb.TypeUsage);
}
return null;
}

情景二的关键代码

如何修改Entity Framework Db Frist模式下的Entity继承关系?的更多相关文章

  1. ADO.NET Entity Framework 在哪些场景下使用?

    在知乎回答了下,顺手转回来. Enity Framework已经是.NET下最主要的ORM了.而ORM从一个Mapping的概念开始,到现在已经得到了一定的升华,特别是EF等对ORM框架面向对象能力的 ...

  2. Entity Framework应用:Code First的实体继承模式

    Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Class Hierarchy(TPH)继承 3 ...

  3. 分享基于Entity Framework的Repository模式设计(附源码)

    关于Repository模式,在这篇文章中有介绍,Entity Framework返回IEnumerable还是IQueryable? 这篇文章介绍的是使用Entity Framework实现的Rep ...

  4. Entity Framework Code First 模式-建立多对多联系

    Entity Framework 在建立多对多的联系时,会生成一个中间表,用来表示这个多对多的关系.这和数据库设计时从概念模型到逻辑模型转化时,多对多的关系不能和任何一端的实体合并,需要将关系也转化为 ...

  5. Entity Framework入门教程:什么是Entity Framework

    Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...

  6. Entity Framework Core系列之什么是Entity Framework Core

    前言 Entity Framework Core (EF Core)是微软推荐的基于.NET Core framework的应用程序数据访问技术.它是轻量级,可扩展并且支持跨平台开发.EF Core是 ...

  7. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  8. Entity Framework 学习系列(1) - 认识理解Entity Framework

    目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...

  9. Entity Framework对同一张表配置一对多关系

    在实际的项目开发中,可能会遇到同一张表同时保存自身和上级(或下级)的信息(一般是通过设置一个上级主键[ParentId]的列与主键[Id]关系) 例如:城市库,有国家.省.市...,省的ParentI ...

随机推荐

  1. Mock.js开发中拦截Ajax

    Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 在我们的生产实际中,后端的接口往往是 ...

  2. Java各种Utils小结

    原文地址:http://trinea.iteye.com/blog/1533616 最新内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用 ...

  3. 7 MySQL--记录的增删改查

    MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的DML语言 ...

  4. JAVA 操作Excel工具类

    Bean转Excel对象 /* * 文件名:BeanToExcel.java */ import java.util.ArrayList; import java.util.List; import ...

  5. C# MemoryStream先写后读的奇怪现象

    static void Main(string[] args) { MemoryStream ms = new MemoryStream(); BinaryWriter bw = new Binary ...

  6. 小菜鸟入门nginx

    实现功能:端口进行转发 比如我实际运行的是·http:localhost:5000 但是我想通过localhost:80 进行访问. 过程 1 下载nginx 2 解压到某个目录(比如我放在C盘根目录 ...

  7. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path问题的解决

    这个问题的解决有二种解决办法: 1.加apache tomcat的运行环境即可 选中项目点击右键 以上这种做法是在eclipse中的做法 2.如果是maven工程,还可以采用maven做法 就在这个工 ...

  8. JAVA程序中使用正则表达式

    import java.util.regex.Matcher;import java.util.regex.Pattern; /** * @author Administrator 测试正则表达式 * ...

  9. codeforces:MEX Queries分析和实现

    首先说明一下MEX,设S是自然数集合N的一个子集,那么S的MEX则为min(N\S),即不包含于S的最小自然数. 题目大意是存在一个空集S,提供n组输入(n<10^5),每组输入对应下面的一个指 ...

  10. springboot与消息(rabbtiMQ)

    1.大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 1.1异步通信 1.2解耦 1.3削峰 2.消息服务中两个重要概念:       消息代理(message broker)和目的地 ...