分类档案:未分类

dbcontext.add-in-efcore(和ddd-win)的另一个用例

如果您像我一样,按照域驱动的设计原则设计类,您可能会发现自己使用这样的代码来控制如何将对象添加到根实体中的集合中。

公共类武士公共武士(字符串名称):this()name=name;}private samurai()u quotes=新列表
          
           ();}公共int id get;私人集合;}公共字符串名称get;私人集合;}private readonly list _quotes=new list()private ienumerable quotes=>_quotes.tolist();public void addquote(string quotext)var new quote=new quote(quotext,id);_ QUOTES.ADD(新报价);}
          

我有一个完全封装的报价集合。添加新报价的唯一方法是通过addQuote方法。你不能只叫samura.quotes.add(myquote)。

此外,因为我想控制开发人员如何与我的API交互,没有用于引号的数据库集。您必须通过context.samurais执行所有查询和更新。

这样做的一大缺点是,如果我有一个新的报价,我知道武士的身份,我必须先查询武士,然后使用addquote。这真让我恼火。我只想创建一个新报价,输入并保存武士的ID值。这需要原始SQL或dbset .我不喜欢这两种选择。在这种情况下,原始SQL是一种黑客,dbset 将打开我的API以防止潜在的误用。

我今天早上躺在床上时想到了这个问题(承认吧,这是你醒来后做的第一件事,同样,对吗?)有了一个主意。

在EF核心中,我们现在可以直接将对象添加到上下文中,而不必通过dbset。上下文可以找出实体所属的dbset,并将正确的信息应用到变更跟踪器。我以为这对打电话很方便

myContext.addRange(个人对象,accountobjectB,产品对象c);

尽管我还没有遇到一个很好的利用它的用例。

我想到的是,如果dbContext.add是使用反射,也许英孚核心能找到一个私有的dBSET

所以我在dbContext类中添加了一个私有dbset:

私人DbSet
          
           引用{得到;集合;}
          
并尝试了此代码(注意我正在使用context.add,不是context.quotes.add):
静态void addquotetosamurai()使用(var context=newsamuraicontext())var quote=newquote(“voila”,1);添加(引用);context.saveChanges();}
效果不错!但这还没有完成。我打破了确保只有我的聚合根可以管理报价的规则。所以这是“危险的”从我的DDD角度看代码。然而,我很高兴知道英孚核心将支持这一能力。
目前,samurai.addQuote没有要对报价执行的任何附加逻辑。如果我加上一个“删除关键词”呢?报价单添加前的规则?
public void addquote(字符串QuoteText)utilities.removeBadWords(QuoteText);var new quote=新报价(QuoteText,ID);_ QUOTES.ADD(新报价);}
现在我有了一个重要的理由用武士来做这件事。我可以再加一秒钟,静态addQuote方法,也接受int。因为它是静态的,这是一种传递方法。
公共静态引号addquote(string quotext,int samuraiid)utilities.removebadwords(quotext);var newquote=newquote(quotext,samuraiid);返回newquote;}

这是可行的,现在我不需要有武士的实例来使用它:

staticvoid addquotetosamurai()使用(var context=newsamuraicontext())context.add(samurai.addquote(“static voila”,1));context.saveChanges();}

我担心的一件事是,如果我有一个武士的例子,并试图用它来增加一个引用到另一个武士。这将打破聚合根…它的工作是只管理自己的报价。它不应该知道其他的武士。

但是。net保护了我。我不能从武士的实例调用静态方法。

我仍然认为从DDD的角度来看,有一点代码味道是关于静态的,在聚合根中传递方法,因此必须对其进行调查(或等待我的注释中出现任何不满意的ddder)。但现在我很高兴我可以避免为了完成这项任务而去查询武士的实例。

下一个:偏心部分,拉斯维加斯10月30日11月2日

今年秋天我离家出走的次数比在家多!我身后有两次旅行:

行程1:Prognet伦敦,盐湖城的多元化生活和丹佛探索DDD。

行程2:奥兰多到安古拉米克斯,然后到迈阿密去拜访朋友和亲戚。

我回家了一会儿,然后又去拉斯维加斯去势.如果你还在考虑去(你应该,真的)你仍然可以使用代码“Lerman”获得小折扣。当你注册的时候。

我将进行三次会谈,参加小组讨论,当然还参加了会谈。

其中一个肯定我会参加的是由两名团队成员(和我的朋友)组成的英孚核心课程。迭戈·维加和安德鲁·彼得斯周二。

我也在做一个英孚核心2谈话,这将是他们的会议的补充(不是多余的)。那是星期三上午的谈话。

周三晚些时候,我将为开发人员做一个会话(应该很有趣),以利用容器中的SQL Server来实现快速开发环境。在这里,我将展示如何设置和使用Docker容器以及SQL Server for Linux(在我的Mac上)以及Windows容器for SQL Server开发人员。对于开发人员或测试环境,这些都是启动SQL服务器的快速而简单的方法。

在我上节课上,星期四,我主要是编代码(耶!还有什么比这更有趣的呢?)建立一个数据API并提供一些设计指导,同时让您获得更多的英孚核心2.0的眼球。为了奖金,我终于掌握了Azure的功能,所以我也可以展示我在那里构建的东西。

之后,我会在关闭面板上。人们永远不知道在那里会发生什么。应该是有趣的。

会议制作的这张图片有多酷,我只想和你分享!

将我的efcore/webapi/postresql/xunit repo更新为1.1

今天,我致力于更新我的长期运行的存储库示例,从ef core是ef 7时开始,到ef core:1.1的最新版本。以下是更新的报告:https://github.com/julielerman/efcore-aspnetcore-webapi-rtm。

此更新的第一阶段继续使用project.json。

除了更新nuget包引用的版本外,我还对代码做了一些更改,以反映一些新特性。

注意工具包。在“工具”部分中,包名称已更改–结尾是note dotnet–,尽管IIS版本是preview2,但当前版本是1.0.0-preview3。

“tools”:“microsoft.aspnetcore.server.iisintegration.tools”:“1.0.0-preview2-final”,“microsoft.entityframeworkcore.tools.dotnet”:“1.0.0-preview3-final”}

在依赖关系中,efcore设计包与efcore的其余部分一样是1.1.0。这是英孚API的一部分,不是工具。

代码更改….

您将发现存储库类中使用的dbset.find方法和change tracker加载方法。这些都添加到EF Core 1.1中。

我修改了WeatherEvent类,使用对映射到IEnumerable的支持来完全封装其反应集合。这导致对构造函数进行了一些更改,并添加了addreaction方法和局部变量。

与EF核心无关,我还修改了seed .cs类。它读取一个硬编码的seed data.json文件来读取种子数据。那个数据用的是旧日期。我想让数据显示当前日期,以帮助我告诉自己,我真的和真的把新数据推到了数据库中。由于WeatherEvent的日期属性是私有的,我处理这个问题的方法是读取原始JSON并以这种方式更新日期值,然后将原始JSON保存回原始文件。然后,我将具有当前日期范围的JSON反序列化为一组天气事件。这也意味着我在中添加了删除/创建数据库,这样每次启动应用程序时,数据库都会被丢弃并重新创建/重新种子化。

测试还将进行更新,以使用最新的包。除了改变版本,我必须添加一个对旧的包(InternalServices)的引用,因为它在XUnit中的依赖关系尚未更新。

这是测试项目的完整project.json,因为我必须通过谷歌搜索才能找到它。

“version”:“3.0.0-*”,“description”:“使用aspnetcore测试简单应用程序,EFCORE和PostgreSQL。在OSX上开发和运行。“,“作者”:[“Julie Lerman”yabo官网,“testranner”:“xunit”,“dependencies”:“microsoft.entityframeworkcore.inmemory”:“1.1.0”,“SRC”:“3.0.0”,“xunit”:“2.2.0-beta4-build3444”,:“dotnet-test-xunit 2.2.0-preview2-build1029”,“Microsoft.DotNet.InternalAbstractions”:“1.0.0”,“frameworks”:“netcoreapp1.0”:“dependencies”:“microsoft.netcore.app”:“type”:“平台”,“版本”:“1.1.0”},“imports”:[“dnxcore50”,“便携式-net45+win8”}}

希望你能找到这个仓库有助于了解EF核心1.1的实际应用。

哦,根据布拉德·威尔逊的微博,我在global.json文件中添加了sdk!

现在我要去了解为什么这很重要。很明显!

生物与照片

截至2012年4月的个人简历和图片

对于会议,用户组,等。

[长传:158字,1021个字符,包括空格]

yabo官网是微软ADO.NET实体框架的主要独立机构,自2006年成立以来一直在使用和教授这项技术。yabo官网朱莉是著名的“编程实体框架”的作者。yabo官网O'Reilly Media出版的系列丛书,最新版本包括code First(2011年12月)和dbContext(2012年2月)。她在.NET社区以微软MVP闻名,AspInsider和Ineta扬声器。她是一位多产的博主,经常在世界各地大小的技术会议上发言,例如TechEd和DevConnections。她还为许多著名的技术出版物撰写文章,包括《msdn》杂志的“每月数据点”栏目。朱莉一直忙于为msdn和multiplesight.com制作培训视频。

Julia住在佛蒙特州,自2002年以来,她一直在佛蒙特州运营着佛蒙特网用户组,是佛蒙特州软件开发联盟的创始董事会成员。你可以阅读她的博客网址:www.www.coedmarros.com/blog她在twitter.com/julielerman上发了微博。

[简短简介:70字,454个字符,包括空格]

yabo官网是Microsoft MVP,.NET导师和顾问,住在佛蒙特州的山上。您可以在世界各地的用户组和会议上找到朱莉在实体框架和其他Microsoft.NET主题上的演示。Julie在datafarm.com/blog上发表博客,是备受赞誉的“编程实体框架”的作者yabo官网书,在multiplesight.com上的msdn杂志数据点栏和流行视频。在Julielerman的Twitter上关注Julie。

朱莉100x130.jpg JuleleX.JPG 朱丽叶·曼吉特.jpg
JuleY100X130 JuleX400 朱丽叶
100 w x 130 h,7kb 400 W×42H,32千字节 10W×127h,5kb

我有更大的,高分辨率版本。给我发电子邮件如果你想要的话。