博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何修改Entity Framework Db Frist模式下的Entity继承关系?
阅读量:6293 次
发布时间:2019-06-22

本文共 1952 字,大约阅读时间需要 6 分钟。

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
where TKey : IEquatable
{ TKey Id { get; } }}
View Code

 

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>0)        {            EdmMember meb=((EdmMember)type.KeyMembers.FirstOrDefault());            return meb==null?null: GetTypeName(meb.TypeUsage);        }        return null;    }
情景二的关键代码

 

转载于:https://www.cnblogs.com/xurongjian/p/6898948.html

你可能感兴趣的文章
html
查看>>
Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第三部分:SqlField)
查看>>
颜色空间系列4: RGB和YDbDr颜色空间的转换及优化算法
查看>>
Unity C# 设计模式(七)适配器模式
查看>>
Lancel sac négociation avec insistance que nous pourrions réaliser de quelle route
查看>>
空白表单提交到后台的数据类型总结(java)
查看>>
Vue问题区
查看>>
[原]Unity3D深入浅出 - Shader基础开发
查看>>
netty之ByteBuf详解
查看>>
数据泵导出oracle 10g数据库
查看>>
LYSE-模块
查看>>
Date Picker和UITool Bar控件简单介绍
查看>>
sql server 实现多表连接查询
查看>>
HTTP 1.1与HTTP 1.0的比较
查看>>
如何在命令行脚本中启动带参数的Windows服务
查看>>
abstract vs interface
查看>>
nodejs笔记1 ----关于express不是本地命令
查看>>
python debug
查看>>
docker-machine 远程安装docker
查看>>
最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
查看>>