摘要: [TOC] WebWindow WebWindow是跨平台的库。 Web Window的当前实验实现可在以下平台上运行: Windows – 需要基于Chromium的Edge Linux – 使用WebKit Mac – 需要Safari 源码 https://github.com/SteveSa 阅读全文
posted @ 2020-03-13 13:07 zeje 阅读(8748) 评论(41) 推荐(24) 编辑

EFCore Database-first深入研究

使用Scaffold-DbContext从数据库生成实体

说明文档:

关于 Scaffold-DbContext 微软有官方说明文档

https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/powershell

实践:

不妨自己找一个现有的数据库试一试:

LocalDB

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext

MySql

Scaffold-DbContext "server=127.0.0.1;Port=3306;database=zejedb;uid=root;pwd=123456;Convert Zero Datetime=True;Allow Zero Datetime=True;Charset=utf8;Default Command Timeout =30000;" Pomelo.EntityFrameworkCore.Mysql -OutputDir Models -DataAnnotations

路漫漫

但是通过上述步骤生成的实体,跟自己想要的还是有那么一丢丢差距。

  • 比如我想通过数据库表注释、字段注释,给实体、属性加上注释貌似就没办法实现。
  • 比如我想统一继承基类,将创建时间、修改时间、创建人、修改人、Id放到基类,貌似也没办法实现。

作为一个被抛弃的10年neter,对于自己未曾研究过源码耿耿于怀(其实n年前我研究过jquery的部分源码,那不算)。因此我毅然下载了EFCore的源码。

源码地址:https://github.com/dotnet/efcore.git

研究EFCore的源码

以Scaffold-DbContext作为突破口:

  • 后来又看到这么几个类:
    • DatabaseModelFactory
    • SqlServerDatabaseModelFactory
    • DatabaseModel
  • 还下载了Pomelo.EntityFrameworkCore.MySql的源码
  • 等等

皇天不负有心人:用了一个周末的时间,关于如何添加注释,我找到了最关键地方

CSharpEntityTypeGenerator

只要重写(Override)此类的GenerateClass,GenerateProperties两个虚拟方法便可

吐槽&继续(痛苦并快乐着)

微软的攻城狮细节怎么就不处理好呢?

    public class CSharpEntityTypeGenerator : ICSharpEntityTypeGenerator
    {
        private readonly ICSharpHelper _code;

        private IndentedStringBuilder _sb = null!;
        private bool _useDataAnnotations;

关键方法:

    public virtual string WriteCode(IEntityType entityType, string @namespace, bool useDataAnnotations)
        {
            Check.NotNull(entityType, nameof(entityType));
            Check.NotNull(@namespace, nameof(@namespace));

            _sb = new IndentedStringBuilder();
            _useDataAnnotations = useDataAnnotations;

            _sb.AppendLine("using System;");
            _sb.AppendLine("using System.Collections.Generic;");

            if (_useDataAnnotations)
            {
                _sb.AppendLine("using System.ComponentModel.DataAnnotations;");
                _sb.AppendLine("using System.ComponentModel.DataAnnotations.Schema;");
            }

            foreach (var ns in entityType.GetProperties()
                .SelectMany(p => p.ClrType.GetNamespaces())
                .Where(ns => ns != "System" && ns != "System.Collections.Generic")
                .Distinct()
                .OrderBy(x => x, new NamespaceComparer()))
            {
                _sb.AppendLine($"using {ns};");
            }

            _sb.AppendLine();
            _sb.AppendLine($"namespace {@namespace}");
            _sb.AppendLine("{");

            using (_sb.Indent())
            {
                GenerateClass(entityType);
            }

            _sb.AppendLine("}");

            return _sb.ToString();
        }

生成实体全然靠WriteCode方法,为什么sb不公开?(后来才知道,他们合并代码有这么一个校验:Public_inheritable_apis_should_be_virtual)
无奈之下,我把整个类都拷贝出来,稍微修改,添加上关键代码

  • 类注释:
var comment = entityType.FindAnnotation("Relational:Comment");
if (comment != null && comment.Value != null)
{
    _sb.AppendLine("///<summary>");
    _sb.AppendLine("///" + comment.Value.ToString());
    _sb.AppendLine("///</summary>");
}
  • 实体注释:
var comment = property.FindAnnotation("Relational:Comment");
if (comment != null && comment.Value != null)
{
    _sb.AppendLine("///<summary>");
    _sb.AppendLine("///" + comment.Value.ToString());
    _sb.AppendLine("///</summary>");
}
  • 测试结果:
总结

生成实体的工具那么多,何必纠缠Scaffold-DbContext不放手?
其实:
1、个人有代码洁癖。
2、有代码注释强迫症。
3、给自己找个强迫自己看源码的理由。

其实实现自动生成代码并带上注释的,个人已经有实现的办法,但是不完美,有些地方还是需要手动修改。纠缠Scaffold-DbContext是另外一种尝试罢了。

放弃Scaffold-DbContext,使用T4模板

为何放弃

难以自定义

  • 无法带注释(上述几行代码已在github上推送了),不过Scaffold-DbContext要支持注释估计是猴年马月的事情了。
  • 不知道怎么继承基类等

PackageReferences在T4模板下的水土不服

使用CopyLocalLockFileAssemblies,将dll复制到bin目录下

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  </PropertyGroup>
  <ItemGroup>
  </ItemGroup>
</Project>

T4模板中引用DLL

<#@ assembly name="$(TargetDir)\Microsoft.EntityFrameworkCore.dll" #>
<#@ assembly name="$(TargetDir)\Microsoft.EntityFrameworkCore.Design.dll" #>

其实本人之前是使用自己写的Zeje.T4_.dll来生成的,现在计划基于Microsoft.EntityFrameworkCore.dll及其扩展类库进行研究,下个周末继续研究。

posted @ 2020-01-12 20:19 zeje 阅读(1889) 评论(9) 推荐(5) 编辑
摘要: 一、废话.net学java为何一直没入坑?其实大家都知道,语法很相似,就是使用的习惯不同稍微的语法差异结构体系不同IDE不同类库集不同各种框架不同对于我来说,我一直被第三道坎拦住了,所以前面的很大的篇幅,都是在说IDE。二、对比感知上的差异我们从一个HelloWorld开始!不同在哪里?Console.WriteLine(“Hello World”); –> System.out.println(... 阅读全文
posted @ 2019-04-01 17:29 zeje 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 最近在慢学习IDEA,总是喜欢与Visual Studio!其实,对于Visual Studio,它的官方(https://docs.microsoft.com/zh-cn/visualstudio/get-started/visual-studio-ide)介绍并不是很多,只是我用熟悉了。但是,我没有去剖析它的目录,我也不知道它是用什么开发出来的神奇!网上搜了这么一句话以供参考:现在用的VS版本... 阅读全文
posted @ 2019-03-26 07:55 zeje 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 上一篇文章 .net基础学java系列(三)徘徊反思本章节没啥营养,请绕路!看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频:https://edu.51cto.com/course/15850.html,此视频分如下13节!1-1 Idea介绍(刷过去,不看了)1-2 Idea安装(刷过去,不看了,官网介绍的使用ToolBox安装,更好!)1-3 idea创建普... 阅读全文
posted @ 2019-03-24 20:45 zeje 阅读(572) 评论(0) 推荐(0) 编辑
摘要: .net基础学java系列(三)徘徊反思 上一篇文章: ".net基础学java系列(二)IDE 之 插件" 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/15850.html ,善未实操。 这两天也确实比较忙,内心也在徘徊着: 一、准备被分配到子公司 阅读全文
posted @ 2019-03-22 00:47 zeje 阅读(876) 评论(3) 推荐(5) 编辑
摘要: 上一篇文章.net基础学java系列(二)IDE“扎实的基础”+“宽广的视野”,基本可以帮我们摆脱码畜、码奴、码农的命运!IT领袖;IT大哥;IT精英;IT人才(遥不可及)IT工程师:年入20万(高级经理级别,有房贷,生活压力大)IT民工:年入10万(经理级别,基本无房,学会装波一,生活压力大)码农:年入6万到10万(工作三四年,租房,继续混日子)码奴:年入3万到6万(工作一两年,租房,混日子)码... 阅读全文
posted @ 2019-03-19 17:50 zeje 阅读(1723) 评论(9) 推荐(4) 编辑
摘要: 上一篇文章.net基础学java系列(一)视野废话:“视野”这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的!有.net的基础再学java,其实并不难,只不过要有更多的付出而已,但是懂多一门技术多一条出路,你说呢?小公司一直在模仿大厂,华为 DevOps 转型之旅微软 DevOps 转型之旅从未得要领,却要求有狼性效应!DevOps,在各个公司... 阅读全文
posted @ 2019-03-17 23:51 zeje 阅读(2274) 评论(4) 推荐(2) 编辑
摘要: .net辗转java系列 阅读全文
posted @ 2019-03-16 23:06 zeje 阅读(3891) 评论(40) 推荐(19) 编辑
点击右上角即可分享
微信分享提示