WEBVTT

1
00:00:01.000 --> 00:00:04.759
How'd you like to listen to dot
net rocks with no ads? Easy?

2
00:00:05.320 --> 00:00:09.880
Become a patron For just five dollars
a month you get access to a private

3
00:00:10.000 --> 00:00:14.400
RSS feed where all the shows have
no ADS. Twenty dollars a month will

4
00:00:14.400 --> 00:00:18.800
get you that and a special dot
net Rocks patron mug. Sign up now

5
00:00:18.839 --> 00:00:24.199
at Patreon dot dot net rocks dot
com. Hey Carlin Richard here. As

6
00:00:24.239 --> 00:00:29.519
you may have heard, NDC is
back offering their incredible in person conferences around

7
00:00:29.559 --> 00:00:33.320
the world, and we'd like to
tell you about them. NDC Oslow will

8
00:00:33.359 --> 00:00:37.119
be me twenty first through the twenty
fifth. Go to NDC Oslo dot com

9
00:00:37.159 --> 00:00:42.840
to register. NDC Copenhagen is happening
August twenty seventh through the thirty first.

10
00:00:42.880 --> 00:00:48.880
The early bird discount for NDC Copenhagen
ends June second. Go to NDC Copenhagen

11
00:00:48.960 --> 00:00:54.719
dot com for more information. NDC
Porto is happening October sixteenth through the twentieth.

12
00:00:54.920 --> 00:00:59.000
The early bird discount for DC Porto
ends July twenty first. Go to

13
00:00:59.079 --> 00:01:03.840
EDDC Porto Do calm to register and
check out the full lineup of conferences at

14
00:01:03.960 --> 00:01:21.799
NDC Conferences dot com. Welcome back
to dot Net Rocks. This is Carl

15
00:01:21.879 --> 00:01:26.680
Franklin and this is Richard Campbell in
our respective corners of North America. How

16
00:01:26.640 --> 00:01:30.439
are you doing, buddy? What's
up? Raining? Lots of rain?

17
00:01:30.719 --> 00:01:34.120
Oh you know, at least it's
not freezing. No, it's not freezing

18
00:01:34.159 --> 00:01:38.680
anymore, warmed up. Yeah,
but yeah, you know it's spring season.

19
00:01:38.840 --> 00:01:40.599
How the bears come out yet?
Oh? Yeah, no, the

20
00:01:40.599 --> 00:01:44.400
bears are around, no question.
We've actually had a full size mountain lion

21
00:01:44.920 --> 00:01:49.200
wandering around, evading fish and wildlife
quite successfully, because they really don't like

22
00:01:49.400 --> 00:01:53.599
having ninety pound cats walking around the
neighborhood. But yeah, yeah, I've

23
00:01:53.599 --> 00:01:59.400
got a good shot of her headed
back into the backyard and into the forest

24
00:01:59.439 --> 00:02:01.599
behind me. But plenty of other
neighbors gotten shots of her as well.

25
00:02:01.719 --> 00:02:08.199
So you know that story about Roy
Rogers and Dale Evans. Dale Evans got

26
00:02:08.280 --> 00:02:15.120
Roy Rogers a new pair of boots
for Easter, and he went out hunting

27
00:02:15.639 --> 00:02:20.199
and he comes across this mountain line
which jumped at him, and he pulled

28
00:02:20.199 --> 00:02:24.159
out his pistol and shot it dead. And but before before the cat died,

29
00:02:24.159 --> 00:02:29.479
it just completely you know, fought. He had to fight it off,

30
00:02:29.639 --> 00:02:35.120
right, and and it tore the
crap out of his boots, so

31
00:02:35.280 --> 00:02:39.240
he slings it over his back and
he comes walking up the lane way and

32
00:02:39.400 --> 00:02:43.199
Dale Evans is on the porch and
she says, part of me, Roy,

33
00:02:43.520 --> 00:02:46.599
is that the cat that cheered your
new shoes. Oh man, that

34
00:02:46.759 --> 00:02:54.000
was a long way to go.
Oh boy. Okay, well, anyway,

35
00:02:54.039 --> 00:03:07.960
let's start start to show. We'd
better know framework this being episode eighteen

36
00:03:07.080 --> 00:03:10.800
forty five. If you go to
eighteen forty five dot pwop dot me,

37
00:03:12.840 --> 00:03:19.759
you will see a tweet from one
McKay Wrigley and he says, Jarvis is

38
00:03:19.800 --> 00:03:27.240
now reality. My GPT four coding
assistant can now build and deploy brand new

39
00:03:27.280 --> 00:03:31.879
web apps. It initializes my project, builds my app, creates a GitHub

40
00:03:31.919 --> 00:03:38.039
repo, and deploys it to versell
all from simply using my voice. Cool,

41
00:03:38.280 --> 00:03:45.879
and he's got a video there And
I just thought this was really telling.

42
00:03:45.919 --> 00:03:49.680
And I remember, do you?
You probably may or may not remember

43
00:03:49.680 --> 00:03:53.479
this because this might have been before
you, but we were talking about automation

44
00:03:53.520 --> 00:03:57.199
and everything, and I was saying, you know, someday you'll be able

45
00:03:57.240 --> 00:04:00.280
to just walk up to a computer
and have a conversation with it in regular

46
00:04:00.360 --> 00:04:08.520
language, and it will spit out
a fully functional business logic included app or

47
00:04:08.560 --> 00:04:13.159
whatever. And whoever was on the
line that day said, nah, that's

48
00:04:13.199 --> 00:04:16.480
that's not going to happen. That'll
never happen. And I don't know that

49
00:04:16.519 --> 00:04:19.160
it has happened, you know,
I don't know that it has either.

50
00:04:19.279 --> 00:04:24.839
But air quotes fully functional. Like
near as I can tell, you've managed

51
00:04:24.839 --> 00:04:29.720
to build a DevOps You put a
chat interface on top of a DevOps engine.

52
00:04:29.759 --> 00:04:31.759
Okay, So are you saying that
this is never going to happen?

53
00:04:32.000 --> 00:04:38.560
I think nevers a funny word,
right, nice edge. Well, eventually

54
00:04:38.560 --> 00:04:42.680
the sun expands and incinerates the planet
too, So right, what context do

55
00:04:42.720 --> 00:04:46.040
you want never in? Okay?
How about in our lifetime? Do you

56
00:04:46.040 --> 00:04:49.720
think some of you able to walk
up to a computer have a conversation,

57
00:04:50.040 --> 00:04:54.439
you know, have the things say
okay, what happens when they press this

58
00:04:54.480 --> 00:04:59.839
button and you say it and then
it spits out let's say, ninety percent

59
00:05:00.079 --> 00:05:03.680
to a completed application. Yeah,
we've already had that technology in our lifetime.

60
00:05:03.879 --> 00:05:06.480
It's just a question of was it
good enough? Because it's also a

61
00:05:06.519 --> 00:05:11.360
moving goalpost, right right, once
upon a time, as long as it

62
00:05:11.399 --> 00:05:15.040
rendered eighty by twenty five texting a
green screen. It was good enough.

63
00:05:15.360 --> 00:05:18.000
Yeah, right now, I expect
it to be on a phone, on

64
00:05:18.040 --> 00:05:21.160
a tablet, on a PC,
works in the cloud, works at home.

65
00:05:21.279 --> 00:05:27.800
Like, expectations keep shifting, so
as long as that momentum is maintained,

66
00:05:27.879 --> 00:05:30.480
and one would argue we've been stuck
in the same form factors for quite

67
00:05:30.519 --> 00:05:34.560
a while now, Yeah, I
guess it also depends on the you know,

68
00:05:34.639 --> 00:05:40.639
the nature of the app. Right. If it's just forms over data,

69
00:05:40.839 --> 00:05:43.959
I can see that happening. But
if it's you know, got something

70
00:05:44.000 --> 00:05:47.040
that you need to hire a CSS
guru for because it has to be pixel

71
00:05:47.079 --> 00:05:49.920
perfect, that's going to be hard. It depends on what the visualizations are.

72
00:05:50.160 --> 00:05:53.319
Yeah, it's going to be hard
to describe it. But look at

73
00:05:53.360 --> 00:05:57.560
the chat interface on top of Power
platform for forms over data, that where

74
00:05:57.600 --> 00:06:00.360
you can describe your intent. Yeah, yeah, that's pretty cool. Yeah,

75
00:06:00.439 --> 00:06:02.839
no, it's very exciting. Well
anyway, that's when I got we

76
00:06:02.879 --> 00:06:05.800
are very much in a hype cycle
right now. Friendly, Yes we are,

77
00:06:06.000 --> 00:06:09.360
Yes, we are, all right. So I was talking to us

78
00:06:09.360 --> 00:06:12.800
today. I grabbed a comment off
of show fifteen sixty six, so I'm

79
00:06:12.839 --> 00:06:15.879
going back a bit. That's the
show we did in July of twenty eighteen

80
00:06:15.879 --> 00:06:19.920
with Corey House talking about graphs Quel, although we didn't talk a fair bit

81
00:06:19.920 --> 00:06:25.319
of any framework in relationship, it's
too graph ql. And this particular comment

82
00:06:25.319 --> 00:06:28.600
comes from Mike Bateman who said,
hey guys, long time listener, first

83
00:06:28.600 --> 00:06:32.000
comment, and we only waited six
years to read it five. I work

84
00:06:32.079 --> 00:06:35.519
for a big company building APIs where
we do rest but not all the verbs.

85
00:06:35.759 --> 00:06:41.000
Nobody does all the verbs, O
data and a little blend of both.

86
00:06:41.120 --> 00:06:44.120
I love this episode. It dug
into issues we face as API builders

87
00:06:44.160 --> 00:06:46.560
and consumers. I'm glad that O
data has been talked about again, as

88
00:06:46.600 --> 00:06:49.279
we been using it for years,
both internally and externally. And my first

89
00:06:49.279 --> 00:06:53.120
impressions of graphql I thought it was
a rip off of O data, which

90
00:06:53.240 --> 00:06:56.480
is not that other thing. However, as I dug into the detail of

91
00:06:56.560 --> 00:07:00.279
graph QLL, I found it to
be more mature, better supported. UI

92
00:07:00.319 --> 00:07:03.279
tooling is a massive help. The
notification of description feature caught my attention to

93
00:07:03.399 --> 00:07:06.839
and this is five years ago.
You know, graph QLs improved since then.

94
00:07:08.160 --> 00:07:11.639
We have lots of sequel databases and
any framework models coated up and using

95
00:07:11.680 --> 00:07:16.079
graphql dot Net library which made building
graph qul service is much quicker and easier

96
00:07:16.079 --> 00:07:20.560
than o data and as for depth
and intense quarrying issues, those existed no

97
00:07:20.720 --> 00:07:25.199
data two. We were hit on
a Saturday afternoon with some crazy od data

98
00:07:25.240 --> 00:07:30.199
queries that actually took down our sequel
servers. Always on a Saturday after right,

99
00:07:30.680 --> 00:07:34.639
and that's the way that works.
I'm sad that o data wasn't endorsed

100
00:07:34.639 --> 00:07:39.120
as much as graphql when it first
came out, but I'm glad graph qul

101
00:07:39.240 --> 00:07:42.480
is here. I'm gonna encourage our
fellow dot net devs to consider it when

102
00:07:42.519 --> 00:07:46.720
building an API. Xmel yea,
no, thanks, no, thanks,

103
00:07:46.800 --> 00:07:49.759
Jason, Yes, please more of
that. Please, it's great work and

104
00:07:49.879 --> 00:07:53.319
keep it up. Oh, great
work to you too, Mike. Sorry

105
00:07:53.319 --> 00:07:56.120
it took me five years reread it
is gone because it's awesome. Yeah,

106
00:07:57.480 --> 00:08:01.920
yeah, and yeah it Isn't it
fascinating how data is evolved and the way

107
00:08:01.920 --> 00:08:05.079
we're working these days, although it
seems pretty stable at the moment, like

108
00:08:05.120 --> 00:08:07.879
we've got a good stack running with
us, and props to Doug Crocfrot totally.

109
00:08:09.040 --> 00:08:11.160
Yeah. So, Mike, thank
you so much for comment. And

110
00:08:11.199 --> 00:08:13.360
a copy of music Code Buy is
on its way to you, and if

111
00:08:13.360 --> 00:08:16.560
you'd like a copy of music codey
I read a comment on the website dot

112
00:08:16.680 --> 00:08:18.600
at rocks dot com or on the
facebooks. We read every one of them

113
00:08:18.720 --> 00:08:22.360
and we comment on a few,
and when we read that comment, I'll

114
00:08:22.360 --> 00:08:24.560
send you a copy of music.
Go buy hey, and definitely follow us

115
00:08:24.560 --> 00:08:28.839
on Twitter. That's all fine and
good, but you should think about following

116
00:08:28.920 --> 00:08:33.840
us on mastadon because that's where the
fun is happening these days. I'm at

117
00:08:33.960 --> 00:08:37.679
Carl Franklin at tech hub dot social
and I'm at Rich Campbell at mastodon dot

118
00:08:37.720 --> 00:08:43.360
social. Send us a tute.
We like getting them. And you know,

119
00:08:43.519 --> 00:08:46.639
if you send us a tute that's
a comment on the show, we'll

120
00:08:46.679 --> 00:08:50.919
read it, just like we do
when you posted on facebooks and all that

121
00:08:50.960 --> 00:08:54.120
other stuff. Right, absolutely,
all right, And with that, let

122
00:08:54.159 --> 00:08:58.480
me try to pronounce Eric's last name
and middle name and not screw it up.

123
00:09:00.600 --> 00:09:05.360
Eric's SkELL Jansen. How's that perfect? All right? He is a

124
00:09:05.399 --> 00:09:11.759
principal consultant at Delegate As He maintains
a number of open source data access tools

125
00:09:11.759 --> 00:09:18.120
and libraries, including ef core power
tools and sequel like Toolbox for Visual Studio

126
00:09:18.639 --> 00:09:26.600
and Multiple Entity Framework providers. He's
been awarded Microsoft MVP fourteen times and enjoys

127
00:09:26.679 --> 00:09:30.840
running comic books and walking his dog. So do you run the comic books

128
00:09:30.840 --> 00:09:33.960
and walk the dog or do you
walk the comic books and run the dog.

129
00:09:37.519 --> 00:09:43.480
There's a comma there, I'm sorry, Leaves. Yeah, let's see

130
00:09:43.519 --> 00:09:48.399
grandma enough, Maybe I'm mast comma. Yes, thank you, Yeah,

131
00:09:48.399 --> 00:09:52.919
welcome to dot net rocks. It's
great to have you. Recently, I

132
00:09:52.960 --> 00:09:58.399
brought up entity framework as being I
made a joke about it being a rapper

133
00:09:58.519 --> 00:10:03.559
around some exception or something like that, and when and only because I have

134
00:10:03.600 --> 00:10:07.080
a little pain with and the framework, and I'm hoping that you might be

135
00:10:07.120 --> 00:10:11.679
able to help me answer the question
that I have. But I'll get to

136
00:10:11.720 --> 00:10:16.600
that a little bit later. First, why don't you introduce yourself and tell

137
00:10:16.679 --> 00:10:20.240
us about what you've been working unlately. Yeah, my name is as you

138
00:10:20.279 --> 00:10:28.200
said, and I work as a
consultant and create apps in usually custom apps

139
00:10:28.559 --> 00:10:35.399
running in as your cloud based on
native app services, and I frequently use

140
00:10:35.679 --> 00:10:41.720
a sequel server for those apps.
It's believe it or not, it's actually

141
00:10:41.720 --> 00:10:46.600
something that's still in use. Is
everywhere. Man's never going away, I

142
00:10:46.679 --> 00:10:52.159
doubt it, and that's quite a
good offering called as a sequel database,

143
00:10:52.240 --> 00:10:58.000
which is everything is completely managed for
you. You don't need to do backups,

144
00:10:58.039 --> 00:11:01.320
you don't need to worry about high
available because everything is already available in

145
00:11:03.080 --> 00:11:07.879
three copies, even for the for
the cheapest stock keeping units and so on.

146
00:11:07.240 --> 00:11:11.960
I've actually taken advantage of that before
UM where you know it's like damn,

147
00:11:11.960 --> 00:11:16.200
I really need a backup of this
database. Hey wait a minute,

148
00:11:16.320 --> 00:11:22.679
there, don't don't go looking.
Yeah so yeah, so, And I

149
00:11:22.840 --> 00:11:30.000
often I like to be productive when
I when I develop as well, and

150
00:11:30.080 --> 00:11:35.240
I think ef core, UM entity
framor core can really help in that respect.

151
00:11:35.320 --> 00:11:37.840
And I have for the benefit of
myself and in order to be even

152
00:11:37.879 --> 00:11:43.200
more productive, but also to help
others, I have published some tools and

153
00:11:43.279 --> 00:11:48.879
some libraries to to help developers be
more productive, for example e of core

154
00:11:48.919 --> 00:11:54.720
power tools. So so, when
ef core was initiated together with dot net

155
00:11:54.799 --> 00:12:00.879
core back in the day, I
think that was like two thousand in seventeen

156
00:12:01.039 --> 00:12:07.679
sixteen. Round that time, the
team didn't work on any graphical tooling because

157
00:12:09.440 --> 00:12:16.440
it was cross platform, so the
effort was spent on on the run time

158
00:12:16.600 --> 00:12:24.480
and performance optimization and not on graphical
tools for a particular platform, like Missile

159
00:12:24.519 --> 00:12:30.120
Studio on Windows, for example.
So I grabbed that opportunity to publish IF

160
00:12:30.159 --> 00:12:35.240
core power tools in agreement with the
courteen because they didn't want to have anything

161
00:12:35.240 --> 00:12:43.000
to do with it. And it
actually makes makes you able to very quickly

162
00:12:43.120 --> 00:12:52.240
start using your database, your existing
database with ef cores by scaffolding the necessary

163
00:12:52.279 --> 00:12:56.399
classes and dB context mappings and so
on, so so you can in a

164
00:12:56.440 --> 00:13:01.159
stronger type fashion, can communicate with
your database from c shop. This was

165
00:13:01.200 --> 00:13:07.440
obviously before that stuff was built Individual
studio. Yeah, it's like in for

166
00:13:07.600 --> 00:13:11.480
the IF six classic, if you
wish that was you could create an idio

167
00:13:11.519 --> 00:13:16.840
mix in visual Studio. But I
mean that was also very much bound to

168
00:13:16.240 --> 00:13:24.039
Visual Studio and Windows and that whole
infrastructure West dot net core was really aimed

169
00:13:24.080 --> 00:13:28.080
at being cross platform, of course, and addressing so we should be able

170
00:13:28.080 --> 00:13:33.519
to run on one all kind of
other operating systems like Linux and Mac and

171
00:13:33.559 --> 00:13:37.840
so on. And I know it's
a little bit crazy, but they actually

172
00:13:37.840 --> 00:13:41.320
open sourced entity framework before dot net
core, I know, I know,

173
00:13:41.519 --> 00:13:46.720
and and actually contributed to that as
well at that time. And I think,

174
00:13:46.919 --> 00:13:50.960
I mean, I'm not sure.
It was the first project that Microsoft

175
00:13:50.039 --> 00:13:54.360
really where they really embraced open source. I think it was a open source

176
00:13:54.399 --> 00:14:01.960
at the same time as ESPNT for
something, but they really embraced open source

177
00:14:01.039 --> 00:14:05.279
in a in a in a good
way. It was one on something called

178
00:14:05.360 --> 00:14:09.759
cooplex. Yeah, remember, which
was before get back exactly back in the

179
00:14:09.919 --> 00:14:18.279
day. But but yes, but
the team was really open to towards contributions

180
00:14:18.360 --> 00:14:24.120
from from computer community members and was
really helpful in providing guidance on how do

181
00:14:24.159 --> 00:14:28.240
I do this, because it's like
they were using some weird source control system.

182
00:14:28.279 --> 00:14:31.679
It wasn't I can't remember now.
It was their own internal one and

183
00:14:31.759 --> 00:14:37.200
it was bizarre. Yeah, exactly. It was like like homemade pre gets

184
00:14:37.200 --> 00:14:41.840
something well, and and GitHub was
the product that was the space that learned

185
00:14:41.840 --> 00:14:46.200
how to take contributors from externals and
so forth. So when they were doing

186
00:14:46.200 --> 00:14:50.840
this or coplex, there really was
no mechanism for that, Like if you

187
00:14:50.879 --> 00:14:54.480
were part of that. That's a
great story too, because they were most

188
00:14:54.559 --> 00:14:58.320
people that most of the groups that
posted stuff on the coplex, they were

189
00:14:58.519 --> 00:15:01.840
building it internally and then we're just
sort of pushing the thing up the CodePlex

190
00:15:01.879 --> 00:15:03.919
to take feedback. Yeah, they
were never really trying to get code from

191
00:15:03.919 --> 00:15:07.480
that, but you actually we're trying
to contribute back then. Actually somehow,

192
00:15:07.960 --> 00:15:11.639
Yeah, I was struggling, but
somehow I managed to contribute. Yeah,

193
00:15:11.639 --> 00:15:16.879
it's awesome. Yeah. Did you
contribute to the code that we run now,

194
00:15:16.960 --> 00:15:22.120
the di scaffolding for Enity framework.
I have contributed to the code that

195
00:15:22.200 --> 00:15:26.120
is running today, the scaffolding for
interfaming and other features, but in particularly

196
00:15:26.159 --> 00:15:31.919
the scaffolding code I have contributed to
because that is the basis I use for

197
00:15:31.000 --> 00:15:35.360
the visual tooling. That visual tools
tooling is built on top of that.

198
00:15:35.720 --> 00:15:39.840
Wow. Of course I didn't didn't
want to have to reinvent the wheel.

199
00:15:41.200 --> 00:15:46.879
And the basic framework provides like each
provider, Like a provider is something that

200
00:15:46.919 --> 00:15:52.440
advises a particular database system like Sequel
Light, Sequel Server as a sequel,

201
00:15:52.519 --> 00:15:58.159
and the post quest and the Oracle
whatever, and they each have the application

202
00:15:58.279 --> 00:16:03.360
to provide a model that describes the
structure of a of a database that you

203
00:16:03.440 --> 00:16:08.879
pointed to. And so there's a
common API for consuming a description of what

204
00:16:08.919 --> 00:16:15.039
the database schema looks like. Wow. So so each provider already supplies that

205
00:16:15.519 --> 00:16:23.159
metadata mechanism and of course I'm I'm
not. I don't want to reinvent anything

206
00:16:23.240 --> 00:16:30.759
basically, so so I'm using all
those mechanisms that are built into the framework

207
00:16:32.559 --> 00:16:34.639
and building on top of that.
To me, what was important about what

208
00:16:34.759 --> 00:16:40.519
became Entity framework ord the open source
version of any framework, is that it's

209
00:16:40.639 --> 00:16:45.840
essentially the first time that Microsoft a
Microsoft team took an existing closed source property

210
00:16:47.840 --> 00:16:52.440
and made an open source version from
it, which seems impossible, like from

211
00:16:52.440 --> 00:16:56.679
the inside. When they succeeded at
that, it wasn't. It was the

212
00:16:56.720 --> 00:17:02.799
most important piece of code is that
it was a mechanism that didn't wasn't believed

213
00:17:02.840 --> 00:17:07.039
to be possible because you know,
a normal way that Microsoft builds code is

214
00:17:07.039 --> 00:17:10.640
they're covering it in patents all the
time. Every time you finish a feature,

215
00:17:11.240 --> 00:17:12.640
you know, as a developer,
you're basically sitting with a lawyer going

216
00:17:12.640 --> 00:17:15.599
through which you built and saying,
is there a patent here? And you

217
00:17:15.680 --> 00:17:19.160
get bonuses based on how many little
cubes you get for getting patents? Right,

218
00:17:19.200 --> 00:17:22.200
Yeah, can you not open source
patented code only if you release the

219
00:17:22.200 --> 00:17:27.920
patents, you're basically junking the patents
forgetting about the patents. Wow? Yeah,

220
00:17:27.960 --> 00:17:33.599
And so to open source entity framework. They unwound those in a variety

221
00:17:33.640 --> 00:17:37.039
of ways. And should I ever
finish this book and not actually die first

222
00:17:38.960 --> 00:17:42.799
all the things they did is kind
of madness, but it was profoundly to

223
00:17:42.880 --> 00:17:45.559
me. It was profoundly important.
But not so much again, not that

224
00:17:45.640 --> 00:17:49.880
they did it, but that the
affected had on the rest of the company.

225
00:17:49.839 --> 00:17:53.079
Yeah, because the rest of the
company was then suddenly you were allowed

226
00:17:53.599 --> 00:18:00.319
to consider the idea of taking existing
code and open source again, or that

227
00:18:00.400 --> 00:18:03.519
it never think it's ever been done. I think about Scott Guthrie, who

228
00:18:03.599 --> 00:18:08.400
championed the open source stuff in the
cloud, and all of the patents in

229
00:18:08.440 --> 00:18:11.599
his office. You've seen them,
right, I mean they're hanging on the

230
00:18:11.640 --> 00:18:15.640
walls, they're in trophies and stuff. He's got like one hundred patents or

231
00:18:15.680 --> 00:18:22.119
something or more, well more,
but plenty of azure Stool still closed source,

232
00:18:22.240 --> 00:18:23.400
right, There's only certain things that
are. I think we can assume

233
00:18:23.440 --> 00:18:29.319
that quite big parts of a still
close source. Yea very much. Yeah,

234
00:18:29.440 --> 00:18:33.000
but but yeah, and the real
answer to open sourcing dot Net was

235
00:18:33.079 --> 00:18:37.640
to rewrite dot net. Yeah yeah, yeah, So the patterns may apply

236
00:18:37.160 --> 00:18:41.880
to the old codebase, but they
which is still closed source. But but

237
00:18:41.960 --> 00:18:47.960
they actually is like from IF from
IF's Classic five, which was completely close

238
00:18:48.000 --> 00:18:53.359
source, and then they actually managed
to build that when they initiated in a

239
00:18:53.440 --> 00:19:00.960
complex for for a version six and
actually got at least one I think there

240
00:19:00.039 --> 00:19:03.960
was. There was. There was
more contributors than me. Not many,

241
00:19:03.079 --> 00:19:07.839
but there was. So the fact
that they took contributors through Coplex to me

242
00:19:07.960 --> 00:19:11.480
is fascinating because it shows Yeah,
it pointed to the way forward and the

243
00:19:11.519 --> 00:19:15.319
fact that they ultimately moved away from
coplex and onto GitHub that was far better

244
00:19:15.480 --> 00:19:21.160
suited to that problem. Absolutely,
absolutely, and of course they realized that

245
00:19:21.400 --> 00:19:26.519
when they started not need to call
that that was an appropriate platform for doing

246
00:19:26.839 --> 00:19:30.759
things like signal R I think was
the first, although it was it was

247
00:19:30.839 --> 00:19:36.680
started as a GitHub project and then
became part of Microsoft later, but it

248
00:19:36.839 --> 00:19:41.000
certainly was a demonstration of contribution.
Yeah, well, should we get back

249
00:19:41.039 --> 00:19:45.759
to any framework? Sorry? Sorry, I could listen to your stories all

250
00:19:45.839 --> 00:19:51.559
day and I can't wait to read
your book. Yeah, it's only someone

251
00:19:51.599 --> 00:19:56.359
who write it'd be awesome. Let's
ask the classic question for all anity framework

252
00:19:56.400 --> 00:20:00.160
people, which is code first or
database first? Yes, I'm I'm a

253
00:20:00.559 --> 00:20:07.519
big fan of a database or let's
this is call it database. Just call

254
00:20:07.599 --> 00:20:14.359
it schemer first. Maybe, yes, I think that's a better name,

255
00:20:15.200 --> 00:20:22.880
because it's like, if you do
the pitfall of doing model first is that

256
00:20:23.880 --> 00:20:34.319
unless you think schemer, think about
the data type and the sizes and the

257
00:20:34.400 --> 00:20:41.079
appropriate data type for each of your
properties, um, you end up doing

258
00:20:41.200 --> 00:20:45.079
something wrong. Like the classic one
is, of course, the fact that

259
00:20:45.240 --> 00:20:51.160
if you define something to be a
string, it will end up as a

260
00:20:51.960 --> 00:21:00.799
barcha max property in field in the
database, which I don't know, maybe

261
00:21:00.839 --> 00:21:04.440
you don't know what this, which
nobody actually wants. Nobody really wants a

262
00:21:04.839 --> 00:21:11.279
string two gigabyte string for storing that
those one hunter. Yeah, if you

263
00:21:11.480 --> 00:21:15.599
do want a too big abyte string, stop that. You don't do that.

264
00:21:15.240 --> 00:21:19.759
That's story is a blob everything.
You shouldn't do that anyway, not

265
00:21:19.880 --> 00:21:26.160
in not in the poor database.
So yeah something. Yeah, And I

266
00:21:26.279 --> 00:21:30.480
love the way you're describing this error
because what you end up doing with code

267
00:21:30.559 --> 00:21:34.920
first then is being very clever about
thinking about how you're going to make your

268
00:21:36.000 --> 00:21:38.200
schemes. And if you're going to
think that way, just make the schemas.

269
00:21:38.279 --> 00:21:41.160
Yeah, it's more discribed exactly,
because then you start. Then you

270
00:21:41.359 --> 00:21:48.359
basically have to take a ate your
model with a tiny fragments of something that

271
00:21:48.519 --> 00:21:56.759
looks basically like sequel, like in
attributes or like small hint thing this isn't

272
00:21:56.279 --> 00:22:00.640
I don't want this. I want
to store this as a string, but

273
00:22:00.759 --> 00:22:03.519
I don't want any foreign characters in
it, so I want it to be

274
00:22:03.799 --> 00:22:07.559
non Unicode, so I have to
use is unicode falls and I want it

275
00:22:07.640 --> 00:22:11.480
to be only two hundred and fifty
characters. I want my dates to be

276
00:22:12.359 --> 00:22:18.480
as small as possible, so I
want them to be with less precision and

277
00:22:18.559 --> 00:22:19.920
so on. You know, it's
an easy way to do that. It's

278
00:22:19.960 --> 00:22:25.720
with create table. It's a very
easy way to do that, exactly clear.

279
00:22:26.039 --> 00:22:32.279
And the cool thing about it is
that's actually in particular in the sequel

280
00:22:32.440 --> 00:22:37.119
server area, which is my kind
of area of expertise here, is that's

281
00:22:37.240 --> 00:22:44.599
really really good tooling for doing that
inside and outside of Visual Studio, in

282
00:22:44.799 --> 00:22:49.599
visual studio and as your data studio
Sigle management studio even yeah, I still

283
00:22:49.720 --> 00:22:56.359
use that in single management studio even
but in particular I'm really fond of of

284
00:22:56.519 --> 00:23:00.400
doing it inside visual studio in what
is called a database project, because you

285
00:23:00.480 --> 00:23:08.720
get like not only intelligence like you
can't write bad create table statements that don't

286
00:23:10.680 --> 00:23:14.440
build or compile or whatever you call
it in the in the secul world,

287
00:23:14.559 --> 00:23:21.599
or cannot execute anyway. But you
also get like a cohesive understanding of your

288
00:23:21.839 --> 00:23:26.640
entire schemer um as part of that
tooling. So if you're writing a view

289
00:23:27.200 --> 00:23:32.960
and you're referencing some other column and
table from that view, you will not

290
00:23:33.039 --> 00:23:36.960
be able to write something pointing to
a column that doesn't exist, because it

291
00:23:37.119 --> 00:23:41.240
knows your entire schemer and can see
that as a model and provide intelligence and

292
00:23:41.680 --> 00:23:45.480
of course the built if you If
you so, we will fail. If

293
00:23:47.079 --> 00:23:51.839
if you are inconsistent and referring to
things that don't exist, right, you're

294
00:23:51.920 --> 00:23:57.960
you're stirring up memories for me,
Matt None road trip the what was the

295
00:23:59.319 --> 00:24:03.400
nickname that for those data projects,
There was a nickname for that technology individual

296
00:24:03.480 --> 00:24:10.839
studio, that guy. We're old
da data data data dude. That's it,

297
00:24:11.000 --> 00:24:11.880
data dude. Yeah, you got
it. You pulled it out,

298
00:24:12.920 --> 00:24:18.240
nice one. That's right. That's
all right. And this was the beginning

299
00:24:18.359 --> 00:24:22.559
of treating that schema as source code. Yeah right, you no longer,

300
00:24:22.680 --> 00:24:26.319
did you know? You no longer? Because you can't just drop a database

301
00:24:26.359 --> 00:24:29.480
and recreated the data. And it's
important. And so the fact that data

302
00:24:29.599 --> 00:24:33.759
Dude would would take your modified schema, analyze your existing database, and write

303
00:24:33.799 --> 00:24:40.359
the altar statements for you. Yeah, you weren't storing the alter statements a

304
00:24:40.440 --> 00:24:44.079
schema. You were storing a new
schema as schema. But the tool would

305
00:24:44.440 --> 00:24:47.880
would fix the two together. Like
yeah, that's a that was a metic

306
00:24:48.000 --> 00:24:52.599
juice, hugely power. Yes.
So so I call it the Sciat State

307
00:24:55.000 --> 00:25:00.079
database M because you actually you're describing
at this point in time, I'm in

308
00:25:00.240 --> 00:25:04.799
order to accommodate this new feature or
whatever, I need these two additional tables,

309
00:25:04.839 --> 00:25:07.200
and I need an extra column,
and I need a foreign key here

310
00:25:07.200 --> 00:25:11.519
and there and so on, and
this this is part of my my new

311
00:25:11.640 --> 00:25:17.799
feature. And so so I want
to describe after I implemented my new feature,

312
00:25:17.880 --> 00:25:21.279
this is what I want the resulting
schema to look like. Nice.

313
00:25:21.480 --> 00:25:25.640
Yeah, So so this desired state, that's what I would call it here.

314
00:25:25.920 --> 00:25:27.680
Yeah, No, And it's very
compelling. And it's one of the

315
00:25:27.839 --> 00:25:33.160
arguments for code first is that it's
just part of your you keep it all

316
00:25:33.200 --> 00:25:36.240
part of your source code. But
it's like, hey, you know better

317
00:25:36.279 --> 00:25:38.759
ways let's sea the schema part of
the source code too, because it is

318
00:25:40.119 --> 00:25:42.720
declarative and coherent, and you know, more people can work on it with

319
00:25:42.920 --> 00:25:48.119
you, and it creates great results
for Entity framework. So yeah, well

320
00:25:48.119 --> 00:25:52.039
I'm glad we're in violent agreement,
Eric, thank you for that. I

321
00:25:52.079 --> 00:25:53.240
don't know where we were gonna get. What is no no, no,

322
00:25:53.319 --> 00:25:59.400
no no? What is dak fx
and so so? Dak fx is actually

323
00:25:59.480 --> 00:26:07.960
an API that Microsoft publishes as a
Nougat package dot Net API, which allows

324
00:26:07.000 --> 00:26:11.599
you to manipulate the result of a
database product. The output of a database

325
00:26:11.680 --> 00:26:17.119
product is something called a duck pack, which is basically a SIP file with

326
00:26:17.920 --> 00:26:25.400
some examil files inside it describing the
schema. So this is what the tooling

327
00:26:26.039 --> 00:26:30.839
reads when it's applying the changes.
It reads this duck pack and compares it

328
00:26:30.960 --> 00:26:37.799
with the running production database. That's
dot d c P A C by the

329
00:26:37.839 --> 00:26:44.839
way, E A c P.
Yes. That framework allows you to create

330
00:26:45.039 --> 00:26:51.799
duck packs programmatically and manipulate them and
deploy them and so on from your from

331
00:26:51.839 --> 00:26:56.880
your own code. So that is
essentially taking the taking a place of a

332
00:26:57.119 --> 00:27:03.240
create scripts like script creation tool exactly
exactly. So it's it's taking the place

333
00:27:03.319 --> 00:27:08.000
of a like migration script or so
one is you can run this from your

334
00:27:08.039 --> 00:27:14.880
own code and do whatever you want. And that's also a command line tool

335
00:27:14.960 --> 00:27:19.799
which of course is just a thin
layer over this API called Sequel package,

336
00:27:21.839 --> 00:27:25.440
which is a dot Net global tool
you can install these days. Wow,

337
00:27:25.599 --> 00:27:30.119
very cool, and that will actually
do like the publishing of of your changes

338
00:27:32.400 --> 00:27:36.880
and I have made tooling. The
more part of the EF core power Tools

339
00:27:37.119 --> 00:27:41.400
features set is that it can actually
read the schemer from a duck pack and

340
00:27:41.680 --> 00:27:45.880
generate the database model from that instead
of from a running database. Nice.

341
00:27:45.960 --> 00:27:52.839
Wow, So you have you have
a like a sometimes here the term in

342
00:27:52.400 --> 00:27:59.240
a developer loop or whatever that where
you where you can actually create something with

343
00:27:59.440 --> 00:28:03.960
your create table statements and then just
quickly run this tooling and then it will

344
00:28:04.079 --> 00:28:11.400
update your c shop model and the
c shop entities based on the team to

345
00:28:11.440 --> 00:28:15.799
set you just made with your Sequel
statements. Yeah. I like that fair

346
00:28:15.839 --> 00:28:18.559
cool. And the more we can
treat a database like it's just other code

347
00:28:19.160 --> 00:28:22.839
part part of the overall package and
goes with with versions and so forth.

348
00:28:22.960 --> 00:28:29.279
Yea. And most importantly with that, it's sort of desired state mindset can

349
00:28:29.359 --> 00:28:37.000
be rolled back I mean not recommended
nobody, but it is possible. The

350
00:28:37.079 --> 00:28:40.880
main thing that everyone's terrified around database
is getting that deadlock state where it's like

351
00:28:40.960 --> 00:28:42.920
the old code won't run and the
new code doesn't work, Like what do

352
00:28:44.039 --> 00:28:48.000
we do? Yeah, yeah,
guys, let's take a quick break,

353
00:28:48.039 --> 00:28:51.119
and when we come back, I'm
gonna ask my question about my old pain.

354
00:28:51.359 --> 00:28:57.319
So stick around. We'll be right
back, and we're back. You're

355
00:28:57.319 --> 00:29:00.240
listening to dot ned Rocks. I'm
car Off Frankle, That's Richard Campbell,

356
00:29:00.880 --> 00:29:06.160
and that's Eric Eiskal Jansen. Uh, and we're talking data. We're talking

357
00:29:06.240 --> 00:29:11.279
Anny framework and so here you go. Eric. When you're using any frameworking

358
00:29:11.759 --> 00:29:15.960
creating a context that you're going to
use on a web back end, like

359
00:29:15.079 --> 00:29:19.119
say from an EPI controller, do
you use tracking or do you turn it

360
00:29:19.200 --> 00:29:26.279
off? It depends. So there
is a use case for tracking, yeah,

361
00:29:26.319 --> 00:29:30.759
on a web back end, because
I always found it to be to

362
00:29:30.880 --> 00:29:37.000
get in the way. So what
is that use? Use it for update

363
00:29:37.240 --> 00:29:45.799
statements. But now there's this new
fangled execute update EPI, so the use

364
00:29:45.880 --> 00:29:49.000
of it is populist. Let's just
step back, man. Yeah, yeah,

365
00:29:49.359 --> 00:29:53.799
maybe a listeners can understand what why
you are asking this question. So

366
00:29:56.519 --> 00:30:03.039
one of the major major features of
IF core is also apart from the ability

367
00:30:03.079 --> 00:30:07.359
to generate sequel statement based on your
careers, is the ability to track changes

368
00:30:07.039 --> 00:30:14.880
to the to the entities that you
hydrate from the database. And it's using

369
00:30:14.960 --> 00:30:18.960
something called a change tracker, which
keeps a copy of everything you read and

370
00:30:18.039 --> 00:30:23.359
then compare so when you're doing updates, it compares the properties see what has

371
00:30:23.440 --> 00:30:27.799
changed. So it's only doing updates
of things that have actually changed, so

372
00:30:27.960 --> 00:30:36.559
it's not like doing a blindfold update
of everything. And of course as an

373
00:30:36.599 --> 00:30:41.119
overhead of running that, like you're
you're doing copies of data and you have

374
00:30:41.240 --> 00:30:45.200
to when you do saves, you
have to do the comparison and to find

375
00:30:45.240 --> 00:30:51.079
out what needs to be updated and
so on. So so in in in

376
00:30:51.160 --> 00:30:56.160
the ape and it's it's always on. You can switch it on, is

377
00:30:56.240 --> 00:31:02.680
like switch it off for your entire
context in your configuration. But but if

378
00:31:02.720 --> 00:31:06.640
you don't do that, it's always
on. So so you you end up

379
00:31:06.799 --> 00:31:11.920
having a lot of s note tracking
statements in your code to turn it off

380
00:31:12.079 --> 00:31:15.759
or for careers that some simply gets
stuff. Yeah, I fun, I

381
00:31:15.799 --> 00:31:18.519
can't remember the issue thought I was
having but I think it was when I

382
00:31:18.559 --> 00:31:22.960
went to go delete something. If
some entity was out there that it was

383
00:31:23.039 --> 00:31:30.119
tracking and I deleted it, it
would complain it wouldn't let me delete things,

384
00:31:30.200 --> 00:31:33.839
little things like that, and it's
like, Hey, I'm the only

385
00:31:33.920 --> 00:31:37.400
programmer here, right, why are
you giving me this trouble? Why are

386
00:31:37.440 --> 00:31:41.160
you hurting me? Yeah? Yeah, So I always turned it off,

387
00:31:42.240 --> 00:31:47.359
and now that will. Of course
seven they've actively made two new APIs,

388
00:31:47.680 --> 00:31:52.480
one called execute delete and one called
execute update okay, which is like you

389
00:31:52.599 --> 00:32:02.599
can it's basically sugarcoating over a link
way of phrasing a bulk update or bulk

390
00:32:04.000 --> 00:32:07.519
delete statement okay, and and by
and by bulk it can I mean it

391
00:32:07.559 --> 00:32:10.880
can also just hit one road,
doesn't have to hit many rows. But

392
00:32:12.519 --> 00:32:17.400
so and and of course then you
kind of all this about change tracking forget

393
00:32:17.440 --> 00:32:23.880
about it because you you basically just
phrasing a strongly typed update statement or a

394
00:32:23.920 --> 00:32:30.240
strongly type delete statement and it's not
tracking anything. I guess. I guess

395
00:32:30.319 --> 00:32:37.480
what's the benefit of tracking when you're
only making calls into any framework database from

396
00:32:37.960 --> 00:32:43.480
you know, an API controller and
you know your your data manager is a

397
00:32:43.559 --> 00:32:45.960
singleton, and like, what's that
what's the point of tracking. Before,

398
00:32:46.160 --> 00:32:52.279
when you had to do a delete
or an update on an on an existing

399
00:32:52.960 --> 00:32:58.079
entity, you actually had to retrieve
it first and then do your your remove

400
00:32:58.519 --> 00:33:02.839
method or your update your properties.
So then you you actually had to have

401
00:33:04.039 --> 00:33:08.640
tracking enabled because otherwise ef CORPS wouldn't
know about those. So if you were

402
00:33:08.720 --> 00:33:14.599
changing like you have a record and
you're changing a state column for example,

403
00:33:15.640 --> 00:33:22.160
in a in a put method,
then you would have to get the entity

404
00:33:22.960 --> 00:33:29.680
and change track it and say I
want to update the state from whatever completed

405
00:33:29.799 --> 00:33:34.039
or something like that, and then
do a safe change is That was that

406
00:33:34.240 --> 00:33:37.160
was the only way you could do
that if you didn't, if you weren't

407
00:33:37.200 --> 00:33:44.680
really keen on right on calling a
stop proceedure of writing work. But now

408
00:33:45.400 --> 00:33:50.720
with these two new APIs, you
don't need to do that. If you

409
00:33:50.759 --> 00:33:54.720
don't, if you just know the
ID of the of the road to delete,

410
00:33:54.759 --> 00:33:59.039
for exam, you would just put
from formulate a link statement where the

411
00:33:59.240 --> 00:34:05.960
ID equal the idea that you just
got in from the controller. Yeah.

412
00:34:06.200 --> 00:34:09.360
Now you're making me think that I
wrote my stuff wrong because it worked and

413
00:34:09.679 --> 00:34:16.920
uh and I had change tracking turned
off. We can do a code review

414
00:34:17.039 --> 00:34:20.159
later. Yeah, yeah, I
would love to. That'd be great.

415
00:34:21.360 --> 00:34:24.320
You know, I admit that I'm
not an entity framework expert, but I

416
00:34:24.360 --> 00:34:30.119
remember people often end up with doing
things like attached and update methods, and

417
00:34:30.199 --> 00:34:34.920
it's like things you should really use
so hard, no exactly, yeah,

418
00:34:36.679 --> 00:34:40.559
so yeah, but but certainly the
U the use of the change tracker as

419
00:34:40.639 --> 00:34:46.079
a and and and tracking changes is
really really useful when you have a desktop

420
00:34:46.119 --> 00:34:51.360
app, yeah, a state state
full app. Yeah, and you have

421
00:34:51.440 --> 00:34:57.360
a long lived TB context, yes, and that is barely the case in

422
00:34:57.519 --> 00:35:01.039
a in a web api s otherwise
you're doing it wrong. Anyway. Any

423
00:35:01.079 --> 00:35:05.880
framework was designed during the age of
wind forms and WPF, wasn't it.

424
00:35:06.079 --> 00:35:10.360
Yeah, yeah, exactly, So
it's like wind forms WPF, those kinds

425
00:35:10.400 --> 00:35:15.679
of like yeah, like disk top
apps, enterprise desktop apps, and they

426
00:35:15.760 --> 00:35:21.920
had made a lot of sense to
I will collect and a number of changes

427
00:35:22.000 --> 00:35:25.599
on this form and then I will
do a safe change. But unfortunately safe

428
00:35:25.679 --> 00:35:32.400
changes. Remember when we call them
smart clients, Yeah, something like that,

429
00:35:34.559 --> 00:35:39.840
why they were dumb clients. Well, and eventually into framework six would

430
00:35:39.840 --> 00:35:45.960
then issue forty insert statements one by
one, yeah, and you would sit

431
00:35:45.039 --> 00:35:52.920
there exactly. So yeah, it's
improved since then. Yeah, yeah,

432
00:35:53.119 --> 00:35:57.000
and we and we write software differently, let's face it, right, like

433
00:35:57.119 --> 00:36:00.280
that's it's interesting to think about trying
to work any more dateless way, that

434
00:36:00.440 --> 00:36:04.880
kind of normal scalable approach to software. But do you say, you know

435
00:36:05.199 --> 00:36:07.559
it's it's stay. We're talking STAATEF
only for data, right. I mean,

436
00:36:08.039 --> 00:36:12.440
if you think about a Blazer application, right, a Blazer server application,

437
00:36:13.079 --> 00:36:16.159
there's state for every user, but
it's not. You don't have long

438
00:36:16.280 --> 00:36:22.239
held dB contacts for every user.
That's crazy because you know if you have

439
00:36:22.199 --> 00:36:27.079
it's fine when you have one client, right and you have a few long

440
00:36:27.679 --> 00:36:31.639
running dB contacts, and that's all
great when you're on a desktop app.

441
00:36:31.679 --> 00:36:36.039
But in a web app you millief
blights, you're not going to have it.

442
00:36:36.760 --> 00:36:38.920
It doesn't really escape. No,
No, as the number of users

443
00:36:39.079 --> 00:36:45.920
rises above one one, you're in
trouble. Yeah, yeah, you're in

444
00:36:46.039 --> 00:36:51.719
trouble. Yeah. So so the
team actually makes a lot of improvements in

445
00:36:51.920 --> 00:36:55.719
in that area also for us like
swoot Putter and scalability, because they wanted

446
00:36:55.880 --> 00:37:02.679
to to do better in a in
a suite called take empower right where they're

447
00:37:02.760 --> 00:37:09.559
measuring against other frameworks and competitors so
to speak. We and we've talked about

448
00:37:09.599 --> 00:37:13.480
this with Scott Hunter a number of
times, that the dot net team as

449
00:37:13.519 --> 00:37:20.159
a whole was big on let's get
good scores on tech em power and the

450
00:37:20.320 --> 00:37:23.480
combination of like razor pages on dot
Net, raizor pages on the linking.

451
00:37:23.519 --> 00:37:29.559
It's like all those different kinds of
setups, and you don't want to be

452
00:37:29.800 --> 00:37:31.679
the one left out, no,
exactly, you don't want it to not

453
00:37:31.880 --> 00:37:37.159
be any framework exactly, And I
mean you can call that. It's also

454
00:37:37.320 --> 00:37:42.440
it's turned out maybe there were tweaking
stuff for just for the purpose or making

455
00:37:42.639 --> 00:37:50.039
things, making very unusual choices about
how they implemented stuff for the purpose of

456
00:37:50.519 --> 00:37:54.519
performance pure performance. Y. I'm
looking at the number one dot net stack

457
00:37:57.719 --> 00:38:07.639
bar chart right now tech empower.
Coming in ninth is asp core on Linux

458
00:38:07.159 --> 00:38:15.400
with postgress raw data database connectivity writing
directly the database. Ye. I don't

459
00:38:15.480 --> 00:38:20.800
know that you do that right,
but exact could be it's a structure to

460
00:38:20.920 --> 00:38:28.760
get good performance exactly. But but
I think you no matter why they did,

461
00:38:28.800 --> 00:38:35.719
there's certainly the any user of ef
core has benefited tremendously sure from from

462
00:38:35.800 --> 00:38:38.599
that, from that optimization, and
that the effort that was engineering effort that

463
00:38:38.719 --> 00:38:42.960
was put into it. Yeah,
there is an entity Framework one and it's

464
00:38:43.039 --> 00:38:47.559
thirty eighth and again still incredibly fast. Right like that. There's a huge

465
00:38:47.599 --> 00:38:52.920
difference between the thirty eighth position and
the first position is a small number.

466
00:38:52.480 --> 00:38:58.000
But it's ASP dot net core running
on Linux with Postgress as a database,

467
00:38:58.280 --> 00:39:05.039
with entity framework. That's not that's
a very reasonable stack. It is not

468
00:39:05.199 --> 00:39:07.079
unusual in any way to look at
it. And and because you're talking,

469
00:39:07.400 --> 00:39:10.480
they call it full o RM.
So it's like, could be pointed at

470
00:39:10.519 --> 00:39:15.039
sequel, could be pointed at my
sequel. You know, it doesn't matter.

471
00:39:15.239 --> 00:39:17.519
I mean, performance is going to
vary obviously, but just the fact

472
00:39:17.559 --> 00:39:21.599
that you can point at it to
say it's in there, it's in the

473
00:39:21.760 --> 00:39:24.920
top hundred, yeah, you know. And it's so it runs in these

474
00:39:25.159 --> 00:39:32.199
extraordinarily high performance numbers. Admittedly for
an artificial task, yeah, constructive test

475
00:39:32.320 --> 00:39:37.400
is but yeah, but nonetheless,
so, yeah, it's good to have

476
00:39:37.480 --> 00:39:43.039
them there. Every every Entity framework
Core provider, of course, needs an

477
00:39:43.199 --> 00:39:47.760
eighty O dot Net provider underneath it. That's that's just that's reality. How

478
00:39:47.840 --> 00:39:52.400
Microsoft, Yah, that's a reality, and that's how Microsoft decided to build

479
00:39:52.400 --> 00:39:58.880
it because otherwise it would never get
anywhere. So they're using existing groundwork of

480
00:39:59.360 --> 00:40:01.280
all the ad dot net providers that
are out there, and on top of

481
00:40:01.360 --> 00:40:07.000
that, you can build a provider
for your database system. Right. And

482
00:40:10.239 --> 00:40:16.440
probably all know that the provider for
a sequel server was System Data sequel Client,

483
00:40:16.840 --> 00:40:21.360
right, Yeah, and in dot
neet framework, and it was actually

484
00:40:21.440 --> 00:40:25.320
also parts of it reported to dotnet
core very early in the dot neet core

485
00:40:25.480 --> 00:40:31.559
time frame. But now Microsoft has
actually open sourced all that and they have

486
00:40:32.519 --> 00:40:40.400
created as as stand alone repository for
the Microsoft client driver of a sequel server

487
00:40:40.519 --> 00:40:45.639
and as your sequel and it's called
Microsoft Data Sequel Client, right. And

488
00:40:45.880 --> 00:40:52.320
also I actually also contribute to that
project. Nice, but so so that's

489
00:40:52.360 --> 00:41:00.280
also a very interesting development. The
problem with that project is that it's it's

490
00:41:00.519 --> 00:41:07.519
it's like a two headed beast.
It's a it has a dot net corep

491
00:41:07.039 --> 00:41:13.079
dot dot net brands, it has
dot Net versions of all the classes,

492
00:41:13.159 --> 00:41:17.199
and it has dot neet Framework versions
of multiple classes, and they're trying to

493
00:41:17.360 --> 00:41:22.239
merge those two. But it's basically
like a two headed beast, and it's

494
00:41:22.679 --> 00:41:28.880
the dot net framework codebase of course, is like, yes, you can

495
00:41:28.920 --> 00:41:34.559
see Scott got three is a signature
in there somewhere or whatever. It's like

496
00:41:34.960 --> 00:41:40.719
two thousand and something one or whatever
or before that. Even of course the

497
00:41:40.800 --> 00:41:45.280
dot net core codebase is newer,
but just because dot neet core is newer.

498
00:41:45.400 --> 00:41:52.320
But then it's also a little bit
quirky because they had to not create,

499
00:41:52.519 --> 00:41:55.800
not add a lot of features for
the first iterations of that dot neet

500
00:41:55.880 --> 00:42:01.239
core because it just just just didn't
have each a parody with dot net framework

501
00:42:01.320 --> 00:42:07.519
at that point. And now they're
trying to move them back. So so

502
00:42:07.760 --> 00:42:13.719
it's it's it's really part of the
performance. Of course, also hintes on

503
00:42:13.800 --> 00:42:21.119
the performance of that driver, right, and it's it's a quirky code base,

504
00:42:21.679 --> 00:42:24.800
and I contribute to it myself,
and the team is really good,

505
00:42:25.400 --> 00:42:29.360
and they're making a big effort,
but I mean, it is what it

506
00:42:29.519 --> 00:42:32.800
is, and they can't they can't
just rip it away and start over.

507
00:42:34.880 --> 00:42:38.280
So so what is happening now,
which I think is extremely interesting, is

508
00:42:38.320 --> 00:42:44.800
that the of Court team, i
assume, in collaboration with some people from

509
00:42:44.840 --> 00:42:52.599
the sequel team, is actually creating
a new provider completely from scratch, using

510
00:42:52.360 --> 00:43:02.559
all the new fangled low memory APIs
like spans and so your educational APIs for

511
00:43:04.000 --> 00:43:07.920
reading stuff directly from the wire and
so on. Well, so it'll I

512
00:43:07.039 --> 00:43:12.360
imagine it'll surface as a lightweight provider
with a limited set of functionality. It

513
00:43:12.440 --> 00:43:16.239
will surface as a definitely surface as
a lightweight provider. And I don't think

514
00:43:16.280 --> 00:43:22.599
the intention is to ever support all
the sequel ball copies, sequel dependency.

515
00:43:22.719 --> 00:43:28.920
You have all these kind of classes
that have emerged one by one in the

516
00:43:29.800 --> 00:43:31.880
classic sequal client, and that will
not be part of it. Sure,

517
00:43:32.760 --> 00:43:37.760
but no, but that it's no
different than parts of the original dot and

518
00:43:37.880 --> 00:43:43.679
framework never made it decre because they
were too dependent on isacic filters or Windows

519
00:43:43.760 --> 00:43:47.599
specific stuff, Windows registry stuff like
that. So yeah, but it came

520
00:43:47.719 --> 00:43:52.920
later in additional packages and things you
could add on. But I could also

521
00:43:52.960 --> 00:43:57.519
imagine once this thing is shipped,
you'll use it where you can and where

522
00:43:57.599 --> 00:44:00.199
you must use the original one.
You will no reason not to use both.

523
00:44:00.719 --> 00:44:04.119
You've got a chunk of code depending
on bulk copy, or use the

524
00:44:04.159 --> 00:44:07.760
old one if you don't care about
performance, you're using bulk copy, yep.

525
00:44:07.880 --> 00:44:14.039
But for the lightweight you know,
scaly nobody does massive millions of bulk

526
00:44:14.119 --> 00:44:16.880
copy operations. They do a few
it'll be the min client thing, yeah

527
00:44:17.039 --> 00:44:20.920
yeah, or maybe they will just
do it from the command line or something

528
00:44:21.039 --> 00:44:23.519
like that. Yeah, not necessarily
in something that's just running all the time,

529
00:44:23.679 --> 00:44:27.920
like that time when we moved all
our data from our sequel server to

530
00:44:27.960 --> 00:44:30.559
Adgure. Remember that we were in
New Zealand. Yeah, I remember that

531
00:44:30.920 --> 00:44:34.880
and it went so well it did, yeah kind of. So, speaking

532
00:44:34.920 --> 00:44:37.800
of performance, I want to know
your thoughts on Dapper, the open source

533
00:44:38.159 --> 00:44:44.679
RM and dapper contrive, which is
another library that adds linked to Dapper.

534
00:44:44.760 --> 00:44:49.719
So Dapper is a lightweight wrapper around
adeo dot net and this is Dapper,

535
00:44:50.000 --> 00:44:55.239
not dap R correct, right,
And it's fast and people when it came

536
00:44:55.320 --> 00:44:59.719
out, we're saying it, you
know, it's faster than and the framework.

537
00:45:00.159 --> 00:45:02.280
And it was for a while,
and then when the new Entity framework

538
00:45:02.320 --> 00:45:06.880
came out, people were telling me
that the performance was on par with Dapper.

539
00:45:07.880 --> 00:45:09.199
I haven't tested, of course,
but that's what they were saying.

540
00:45:09.239 --> 00:45:14.159
So what do you think about it? I think it really served a purpose

541
00:45:15.199 --> 00:45:20.480
at one point in time where there
was people suffering from performance issues with the

542
00:45:21.440 --> 00:45:24.760
in particularly with entitive framework. But
I mean also the initial iterations of you,

543
00:45:24.840 --> 00:45:30.840
of course certainly had room for improvement. Yeah, that is no longer

544
00:45:30.920 --> 00:45:36.559
the case. That's been we talked
about with taking power effort that has been

545
00:45:36.639 --> 00:45:39.880
taking place. There's been a lot
of work done in that area, and

546
00:45:40.039 --> 00:45:46.679
the queerer performance is definitely on par
with Dappa and therefore eighty on that.

547
00:45:47.679 --> 00:45:55.800
Yeah. Yes, Dappa has the
ability to serialize any class you have in

548
00:45:55.920 --> 00:46:00.880
your code, so populate any class
you have in a code from a secret

549
00:46:00.920 --> 00:46:08.559
query and that has not been a
feature of ef core until if Core eight,

550
00:46:08.679 --> 00:46:13.880
which is coming later this year,
So you can take any class you

551
00:46:13.960 --> 00:46:17.719
have in your code and serialize it. I don't think it supports things advanced

552
00:46:17.760 --> 00:46:23.280
things like multiple results sets like Dabba
does, and that's probably not coming.

553
00:46:23.360 --> 00:46:29.599
So if you have a need for
that, like consume multiple sub results,

554
00:46:29.639 --> 00:46:32.599
it's from a start procedure or something. Yeah, then Dabba certainly still has

555
00:46:34.239 --> 00:46:37.199
a place. I'm speaking for myself, but I really like that I don't

556
00:46:37.239 --> 00:46:42.280
have to have too many dependencies that
does something that's almost the same thing.

557
00:46:42.559 --> 00:46:45.440
Yeah. Right. Also, you're
kind of locked in a sequel serve with

558
00:46:45.519 --> 00:46:49.239
Dapper because it's really for sequel,
isn't it or does it work with any

559
00:46:49.280 --> 00:46:52.559
ad on that. I think it's
supports, No, it's supports in it.

560
00:46:52.719 --> 00:46:55.559
Basically it supports a number of adio
providers. Okay, that makes sense

561
00:46:55.719 --> 00:47:00.320
because it's yeah, no, it's
just it's just a rapper over a deep

562
00:47:00.440 --> 00:47:04.159
connection. Acted. Yeah, so
it supports any a lot of adio dot

563
00:47:04.239 --> 00:47:07.400
net providers, got it. Yeah, but still, yeah, it's nice

564
00:47:07.440 --> 00:47:13.159
to know that. I think it
gives me great confidence to know that the

565
00:47:13.239 --> 00:47:17.880
stack I'm using can do everything I
want to do, right from from raw

566
00:47:19.039 --> 00:47:27.679
sequel mapping stock procedures, mapping random
classes in my code to advanced link queries.

567
00:47:28.280 --> 00:47:31.800
And I appreciate the idea that they've
optimized enough of EF that they're now

568
00:47:31.840 --> 00:47:37.400
looking at the providers because that's where
the winds are going to come exactly,

569
00:47:37.599 --> 00:47:42.079
exactly. Yeah, I think that's
a really interesting development that now they can't

570
00:47:42.119 --> 00:47:46.880
really do more because of just how
dot networks. You can't you can only

571
00:47:46.920 --> 00:47:51.920
do so much. Oh yeah,
Stephen's hub has done all the things exactly

572
00:47:52.559 --> 00:47:57.480
the optimization options are diminishing, and
written two hundred pages blog posts about it.

573
00:47:57.599 --> 00:48:00.800
So yes, it's amazing. Yeah, yeah, if I just you

574
00:48:00.800 --> 00:48:04.679
know, it's one of those blogboards
like I just trust you using new code.

575
00:48:04.719 --> 00:48:07.400
Will you not make me read this? Please? It's a complic The

576
00:48:07.519 --> 00:48:12.360
only thing worse it is that long? Is it so complex? Yeah?

577
00:48:12.599 --> 00:48:16.559
Yeah? Yeah? If you ever
wanted proof that optimized code is more difficult

578
00:48:16.639 --> 00:48:21.760
to read, right, there's a
reason why we use these abstractions like entity

579
00:48:21.840 --> 00:48:24.880
framework and so forth to make data
acts as simpler. Yeah, raw calls

580
00:48:24.960 --> 00:48:30.159
would be faster, but would you
read that code? Right? You don't

581
00:48:30.199 --> 00:48:34.320
want to look at optimized code.
It makes you sad? Yeah, you

582
00:48:34.400 --> 00:48:37.559
just want to use it, yeah, exactly, just wanted benefit from it.

583
00:48:37.760 --> 00:48:42.519
I switched up to dot net seven
and my stuff was faster. So

584
00:48:42.599 --> 00:48:45.119
speaking of dot at seven, let's
say we got some old F six running

585
00:48:45.119 --> 00:48:50.119
on dot framework. We want to
move it into dot net seven or even

586
00:48:50.239 --> 00:48:52.920
dot net eight or even done at
six. I mean, what is involved

587
00:48:52.960 --> 00:48:57.280
in doing that? Is it?
Is it as going to be as painful

588
00:48:57.320 --> 00:49:02.320
as I think? Actually? At
one at one point, the ef EF

589
00:49:02.519 --> 00:49:13.039
team created a Dotnet standard two point
one version of the EF six Classic,

590
00:49:14.079 --> 00:49:19.159
which means that you can actually run
IF six on dot neet core or dot

591
00:49:19.199 --> 00:49:29.800
neet six or seven or eight.
Yes, m that codebase that provider is

592
00:49:30.320 --> 00:49:37.119
of course Sequel server only, and
it also still uses the legacy System Data

593
00:49:37.239 --> 00:49:43.199
Sequel Client. Okay, so it
doesn't get all like if there's a new

594
00:49:43.360 --> 00:49:46.360
version of Sequel server that requires some
client team is they would not be incorporated

595
00:49:46.440 --> 00:49:53.480
because that that piece of software is
only maintained for top security issues and nothing

596
00:49:53.559 --> 00:49:59.400
else. So it's it's basically like
in maintenance mode. Could you use it

597
00:49:59.440 --> 00:50:02.000
as a step in stone, where
would you go from there? I published

598
00:50:04.079 --> 00:50:09.119
I have six provider which bridges the
gap, so you can take advantage of

599
00:50:09.239 --> 00:50:15.400
this new Microsoft Data Sequence client driver
we just spoke about. And it's of

600
00:50:15.480 --> 00:50:22.320
course supports all the always encrypted technology
that's come recently with the Sequel server.

601
00:50:22.559 --> 00:50:30.400
It supports all the authentication methods,
the new authentication methods against as your sequel

602
00:50:30.519 --> 00:50:37.639
like manage Identity, which allows you
to create passwordless connections from your app service,

603
00:50:37.679 --> 00:50:43.519
for example, to an assequel database
similar to what you were used to

604
00:50:43.719 --> 00:50:51.480
on premises with the integrated security and
so on. And that is not that's

605
00:50:51.599 --> 00:50:54.679
not very good supported in System Data
Sequel Client, but of course it's fully

606
00:50:54.719 --> 00:51:04.000
supported in Microsoft Data Sequence. So
I probably an alternative provider that bites a

607
00:51:04.079 --> 00:51:08.639
gap. And I was actually recently
just fortunate enough to have a pull request

608
00:51:08.719 --> 00:51:16.519
accepted for Entity Framework six that will
that will publish what I did as a

609
00:51:16.719 --> 00:51:22.719
as a supported Microsoft provider for that
useless Microsoft Data secut client instead of a

610
00:51:22.920 --> 00:51:30.039
system data secret, so you get
all the benefit of yea like sequel.

611
00:51:30.079 --> 00:51:36.000
Server two thousand and twenty two also
introduced a new over the wire protocol that

612
00:51:36.199 --> 00:51:40.000
works better with firewalls called t D
said, you can google it and read

613
00:51:40.039 --> 00:51:45.760
about it. But in order to
get that support, so it's more better

614
00:51:45.920 --> 00:51:50.800
encryption of what happens over the wire, even login process is encrypted. It

615
00:51:50.960 --> 00:51:55.559
wasn't before. So and in order
to you get that you need you didn't

616
00:51:55.679 --> 00:52:02.760
need the latest client driver. And
my package which is currently published and supported

617
00:52:02.840 --> 00:52:10.000
but only by me, not by
my UM is a certainly a stepping stone

618
00:52:12.000 --> 00:52:15.360
that can help you there. That's
very course. So you've got all these

619
00:52:15.440 --> 00:52:22.400
extensions and open source tools and products, um, we'll add links to them,

620
00:52:22.480 --> 00:52:28.360
of course. But what about somebody
who was writing extensions and wants to

621
00:52:29.559 --> 00:52:34.559
get individual studio You have any advice
for them? Yes, mass christ follow

622
00:52:34.960 --> 00:52:38.400
follow mass christis and he's a program
manager on the Visual Student team and he

623
00:52:38.559 --> 00:52:44.880
has a regular on the show.
Yes, and he has published a lot

624
00:52:44.920 --> 00:52:52.719
of content about extensibility. Um like
he had some like workshops where he like

625
00:52:54.559 --> 00:53:01.519
took you through creating an extension completely
from scratch insous studio with serving various purposes,

626
00:53:01.760 --> 00:53:07.400
and a lot of what he did
in his basement there was actually ended

627
00:53:07.480 --> 00:53:12.960
up being published extensions. So if
you if you prefer to do like viewing

628
00:53:13.199 --> 00:53:16.559
stuff on YouTube or similar media,
then that's definitely a little way to go.

629
00:53:16.719 --> 00:53:21.920
And he's really really good at explaining
stuff. Yeah, and there is

630
00:53:22.079 --> 00:53:27.639
a library that can also help you
because it is a little bit of it

631
00:53:27.760 --> 00:53:30.559
can quickly become a little bit of
a black back art. But the mass

632
00:53:30.599 --> 00:53:36.880
Cusson, together with some other clever
guys at Microsoft, has created a tool

633
00:53:37.000 --> 00:53:42.519
called the Visics Community tool Kit,
which is a library that makes it easy

634
00:53:42.639 --> 00:53:49.000
to do things that you would normally
do as an extension writer and not having

635
00:53:49.079 --> 00:53:53.599
to find out this is this interface
and you have to convert it to this

636
00:53:53.800 --> 00:54:00.159
implementation and then call this and that
method and put the h ref and get

637
00:54:00.280 --> 00:54:06.400
a zero non zero quote back from
this co operate them. So when all

638
00:54:06.480 --> 00:54:12.519
that's is wrapped nicely for you in
this library, So doing things like showing

639
00:54:12.599 --> 00:54:17.760
messages in a business studio, addressing
the status BA and putting up like yellow

640
00:54:17.920 --> 00:54:22.559
bars and things like that that you
want to do from your extension becomes like

641
00:54:22.880 --> 00:54:29.719
basically a one liner using that That
library nice. So that's definitely my recommendation

642
00:54:29.880 --> 00:54:31.800
is to the best way to get
started with that. Well, this is

643
00:54:31.840 --> 00:54:38.519
all Danish mafia stuff, right,
Yeah, And what I appreciate about Mads

644
00:54:38.559 --> 00:54:44.000
Christensen is he walks the walk like
that. Dude's got a lot of extensions,

645
00:54:44.559 --> 00:54:46.679
Like there's a reason why he can
explain it so well, he does

646
00:54:46.800 --> 00:54:51.360
the work. He does it.
Yeah, I mean, it's just it

647
00:54:51.519 --> 00:54:54.639
must be huge effort for him just
to keep all his extensions current. Oh

648
00:54:54.760 --> 00:55:01.039
yeah, that's great. Yeah.
Well and his ad file extension essentially that

649
00:55:01.559 --> 00:55:07.039
made it individual studio. Many many
of his extension has gradually paved their way

650
00:55:07.119 --> 00:55:12.079
into a visual studio one by one. So it's it's very cool, very

651
00:55:12.119 --> 00:55:14.400
cool. Yeah. So what's next
for you, my friend? What are

652
00:55:14.400 --> 00:55:20.679
you working on? I'm so the
ef Core power Tools, which has about

653
00:55:21.199 --> 00:55:25.599
three hundred thousand installs currently in visual
studio, and that of course is yeah,

654
00:55:25.639 --> 00:55:30.440
it wakes me very proud, but
it's it's still Windows only. You

655
00:55:30.559 --> 00:55:37.280
need Visual Studio on Windows in order
to use it. Recently, I actually

656
00:55:37.440 --> 00:55:44.000
somebody said, oh can this run
on Arm? It could now that visou

657
00:55:44.039 --> 00:55:47.599
Studio runs on Arm, so yeah, yes, but it's still limited to

658
00:55:47.719 --> 00:55:52.519
Windows of course. Yeah. So
the next thing I'm working on is is

659
00:55:52.559 --> 00:55:58.800
actually taking that. Um. So, as I said earlier, I'm basing

660
00:55:59.360 --> 00:56:05.559
my two ruling on the scaffolding EPI
if you wish that that if Core provides.

661
00:56:05.639 --> 00:56:09.920
But I'm adding a lot of additional
features, and all those additional features

662
00:56:10.400 --> 00:56:15.400
I would like to make them available
to other users on other platforms. So

663
00:56:15.639 --> 00:56:21.800
I'm next. For me, it's
basically thinking about creating a command line version

664
00:56:22.679 --> 00:56:30.039
of ef core power Tools. Yeah. Um and of course I mean some

665
00:56:30.159 --> 00:56:34.079
people ask me, can I is
a googie for this in Visual Studio code.

666
00:56:34.880 --> 00:56:38.360
Well, at least I give the
groundwork for somebody to so maybe I

667
00:56:38.480 --> 00:56:44.800
don't know anything about the other script
or so I couldn't even I wouldn't know

668
00:56:44.800 --> 00:56:49.960
where to start. We will not, but somebody else can then wrap my

669
00:56:50.119 --> 00:56:55.880
command line tool in some some nice
configuration googie to show my my configuration file

670
00:56:57.840 --> 00:57:00.199
in there. So so it will
be a big, big stepping stone for

671
00:57:00.320 --> 00:57:06.960
me, and then I'm also quite
exciting for me because I've never really if

672
00:57:07.079 --> 00:57:10.159
something ran on other platforms that I
created, it was by accident, it

673
00:57:10.280 --> 00:57:16.039
was not intentional, so so I'm
really looking forward to that. Yeah,

674
00:57:16.159 --> 00:57:19.639
that's great. Well, Eric Jansen's
finn to like to have you on the

675
00:57:19.679 --> 00:57:23.239
show and thank you for all your
hard work in great to dissemination of this

676
00:57:23.639 --> 00:57:29.760
complex topic. It's it's great,
great to talking to you. Thanks for

677
00:57:29.840 --> 00:57:32.440
having me, all right, and
we'll talk to you next time on dot

678
00:57:32.599 --> 00:57:59.320
net rocks. Dot net Rocks is
brought to you by Franklin's Net and produced

679
00:57:59.400 --> 00:58:04.960
by Pops Studios, a full service
audio, video and post production facility located

680
00:58:05.039 --> 00:58:08.599
physically in New London, Connecticut,
and of course in the cloud online at

681
00:58:08.679 --> 00:58:15.800
pwop dot com. Visit our website
at dt n et r ocks dot com

682
00:58:15.320 --> 00:58:21.079
for RSS feeds, downloads, mobile
apps, comments, and access to the

683
00:58:21.199 --> 00:58:24.800
full archives going back to show number
one, recorded in September two thousand and

684
00:58:24.840 --> 00:58:29.239
two. And make sure you check
out our sponsors. They keep us in

685
00:58:29.360 --> 00:58:35.079
business. Now go write some code
CNX time Goman

