首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记

28 | 工作单元模式(UnitOfWork):管理好你的事务 工作单元模式有如下几个特性: 1、使用同一上下文 2、跟踪实体的状态 3、保障事务一致性 我们对实体的操作,最终的状态都是应该如实保存到我们的存储中...default); Task SaveEntitiesAsync(CancellationToken cancellationToken = default); } 这两个方法的区别是:一个是返回的...int 是指我们影响的数据条数,另外一个返回 bool 表示我们保存是否成功,本质上这两个方法达到的效果是相同的 另外还定义了一个事务管理的接口 public interface ITransaction...CommitTransactionAsync(IDbContextTransaction transaction); // 事务回滚 void RollbackTransaction(); } 实现上我们是借助...把当前的事务用一个字段存储 public IDbContextTransaction GetCurrentTransaction() => _currentTransaction;// 获取当前的事务就是返回存储的私有对象

2.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

.NET EF Core(Entity Framework Core)

4、EF中的一些类的命名空间以及一些方法的名字EF Core中稍有不同。 5、EF不再做新特性增加。...2:数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型。 3:数据表列的可空性 取决于对应实体类属性的可空性。...Data Annotation配置方式 把配置以特性(Annotation)的形式标注实体类中 [Table("t_books")] public class Book { public...Logging框架 optionsBuilder.LogTo(Console.WriteLine); //可以自己写代码过滤一些不需要的消息 方法3:ToQueryString EF Core的Where方法返回的是...对于ROWVERSION类型的列,每次插入或更新行时,数据库会自动为这一行的ROWVERSION类型的列其生成新值。

14011

迁移 appseting.json 创建自定义配置中心

按照之前的做法,我们可以通过program.cs中使用WebHost.ConfigureAppConfiguration去读取数据库的数据,然后填充至配置中去实现,如下图: 这样做会有两个问题 配置是程序入口的创建主机配置...这里可以使用观察者模式,去监控配置实体的改变事件,如果有修改则调用一次构建方法去覆盖配置中心的IConfiguration。...实现最简便的方法则是SaveChange之后加入实体监控 internal class DiyEFContext : DbContext { public DiyEFContext(DbContextOptions...调用初始化方法,返回IConfiguration 使用IConfiguration的GetSection(string key)方法,GetChildren()方法,GetReloadToken()方法去获取对应的值...// 初始化之后返回 IConfiguration对象 var configuration = EFConfigurationBuilder.Init(conn, DbType.MySql, out

1.2K40

Asp.Net Web API 2第十八课——Working with Entity Relations in OData

但是一个导航属性也能返回一个集合(一对多或者多对多的 关系)。...这个方法返回关联的实体——在这个实例中,就是一个Supplier对象。方法的名称和参数的名称都是非常重要的。总之,如果导航属性被命名为一个“X”,你需要添加一个被命名为“GetX”的方法。...Creating and Deleting Links OData支持创建和删除两个实体之间的关系。OData术语中,这个关系就是一个“link”。...这个方法调用Web API路由过程,返回一个OData实体,展现被转换的OData路径。对于一个链接URI,这个片段数中应该有一个实体键。...这个DeleteLink方法将会有如下签名: void DeleteLink([FromODataUri] int key, string relatedKey, string navigationProperty

75351

Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章

model.Content; this.context.Update(topic); var affrows = await this.context.SaveChangesAsync...从报错信息中可以看出,数据库上下文对象被销毁了,是什么时候销毁的呢,通过跟踪程序,了解到,是 this.context.Update(topic); ,调用 Update 后执行了 DbContext.Dispose...,EFCore 中启用了 AutoDetectChangesEnabled,我们在上面的代码中其实无需调用 Update,直接 SaveChangesAsync 即可,也不会抛出异常,同理,如果是同步方法中...问题的解决方案 3.1 问题分析 为什么会发生这种问题呢,原因就是因为使用了异步方法 async/await 时,当没有值需要返回时,使用了 void 造成的,正确的做法是如果没有返回值,则返回 Task...中,应当始终发挥 AutoDetectChangesEnabled 的特性,不要再更新实体的时候去调用 Update 方法 3.2.2 使用 async/await 修饰方法时,应该始终返回 Task

70230

ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作

三、创建对应数据库表的实体模型:   注意该篇博客使用的是手动模型优先的方式进行数据库表字段与模型属性映射,当然如果大家觉得这样子比较麻烦的话可以真正意义上的模型优先,直接创建模型program.cs...上下文指定数据模型中包含哪些实体。 在此项目中将数据库上下文类命名为 SchoolUserInfoContext。...定义 DbSet 属性的代码之后,添加下面代码,对DbContext指定单数的表名来覆盖默认的表名。..._shoSchoolUserInfoContext.UserInfos.Add(userInfo); await _shoSchoolUserInfoContext.SaveChangesAsync...shoSchoolUserInfoContext.UserInfos.Update(userInfo); await _shoSchoolUserInfoContext.SaveChangesAsync

2.8K10

eShopOnContainers 知多少:持久化事件日志

问题 既然上面提到了一致性问题,那具体的问题是什么呢,什么情况才会发生呢?我想我有必要简单举例。...如果服务在数据库更新后崩溃(奔溃发生在_context.SaveChangesAsync()代码执行之后,但又发生在集成事件成功发布前),就会导致本地微服务价格已成功更新,但集成事件未发布的问题。...其他微服务通过启动类中注册IntegrationEventLogContext即可完成事件日志的集成。...如何借助事件日志确保高可用 主要分两步走: 应用程序开始本地数据库事务,然后更新领域实体状态,并将集成事件插入集成事件日志表中,最后提交事务来确保领域实体更新和保存事件日志所需的原子性。...发布事件 第一步毋庸置疑,第二步发布事件,我们又有多种实现方式: 提交事务后立即发布集成事件,并将其标记为已发布。当微服务发生故障时,可以通过遍历存储的集成事件(未发布)执行补救措施。

59550

.NET Core开发实战(第30课:领域事件:提升业务内聚,实现模块解耦)--学习笔记

Clear(); } 将领域事件做一个实体的属性存储进来,它应该是一个列表,因为一个实体操作过程中间可能会发生多件事情,领域事件应该是可以被实体模型之外的代码读到,所以暴露一个 ReadOnly 的...可以看到我们先进入到了创建订单的处理系统(CreateOrderCommandHandler),接着进入到了领域事件发布的 Publish 的代码(MediatorExtension),当仓储存储完毕之后...,进入到了 OrderCreatedDomainEventHandler,也就是说我们创建完我们的领域模型并将其保存之后,我们的领域事件的处理程序才触发 之前讲解实现 UnitOfWork 的时候(...EFContext),我们的 SaveEntitiesAsync 里面只有一行代码是 SaveChangesAsync,这里添加了一行代码,是发送领域事件的代码 DispatchDomainEventsAsync...,然后从跟踪到的实体的对象中获取到我们当前的 Event,如果 Event 是存在的,就把它取出来,然后将实体内的 Event 进行清除,再然后将这些 Event 逐条地通过中间件发送出去,并且找到对应的

53410

ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取

前文索引: ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证 ASP.NET Core教程【一】关于Razor Page的知识 实体字段属性 再来看看我们的实体类...把页面中的第一个命令:@page,修改为:@page "{id:int}" 重新编译运行,发现上面的链接变成了: http://localhost:5000/Movies/Details/1 看到这里你会说“呦~”?...如果这个时候你请求这个地址: http://localhost:5000/Movies/Details 并没有传入ID的值,那么服务器会返回404, 如果你的设计是希望ID是一个可选的传入参数,那么你可以把...并发数据异常 当一个用户删除了一个实体,另一个用户同时又要更新这个实体的话 第二个用户的请求就会抛出并发数据异常(这里姑且称作并发,微软官网就是这么说的),来看代码: public async Task...Page(); } _context.Attach(Movie).State = EntityState.Modified; try { await _context.SaveChangesAsync

1.6K60

熟悉而陌生的新朋友——IAsyncDisposable

(该部分内容本文将不做过多介绍) 虽然析构函数方法某些需要进行清理的情况下是有效的,但它有下面两个严重的缺点: 只有GC检测到某个对象可以被回收时才会调用该对象的终结方法,这发生在不再需要资源之后的某个不确定的时间...以往同步版本的代码中,我们往往会选择SaveChanges同步方法。 当来到了异步的环境,我们往往会选择SaveChangesAsync。...所以AspNet Core这个全流程异步的大环境下,我们的代码潜移默化的就会更改为SaveChangesAsync。....NET 5 之后,大部分的类都具有了IAsyncDisposable的实现。...为什么会有这样的结果呢? 让我们一起来扒开它的面纱。

71410

Async,Await和ConfigureAwait的关系

最后,所有这些操作都是等待数据库返回结果时(本例中)让其他请求使用当前线程。...这样,我们就不会有空闲的“worker”(线程)在那里等待完成其他任务。这就像去快餐店一样,在你点完菜之后,其他人不会点任何东西,直到你吃完为止。...代码的作用类似于“同步”,因为您可以await之后以本方法继续执行代码。因此,如果在一个方法中有四个await,则必须等到每个方法都完成后才能调用下一个方法。...注意:如果需要language/culture,可以始终await之前存储当前相关状态值,然后await新线程之后重新应用它。...另一个问题是调用者永远不会知道它何时结束,因为它不返回任何东西。因此,如果你关心什么时候完成某个Task,那么实际上需要返回一个Task。

69110

如何运用领域驱动设计 - 领域事件

由此我们可以推导出:领域驱动设计建模过程中,如果发现有一项动作发生了之后,与之关联的其他领域对象将会受到波及。 那么该动作可能就是“领域事件”。...所以我们可以很自然的将目光转向到“购物车”,“购物车”可能就是一个聚合根,它会有一个叫做“添加商品”的行为,当该行为完成之后就会引发一个“商品添加完成”的事件。...就好比“推荐商品”受到了“商品添加完成”事件之后,它自己也能产生一个另外的领域事件传递给下游。 思维的转换 到这里您或许会感到使用领域事件和以往咱们捕获其他对象不太一样,比如捕获值对象、实体等。...当Evans初次提出领域驱动的概念时,是没有考虑领域事件的,那么也就意味着我们能够通过原有的领域对象完成领域建模和业务流程。 回到刚才那个问题,聚合与聚合之间只能通过事件完成操作?不一定。...先回顾一下咱们领域服务章节了解到的部分内容: 当我们发现一个操作无法赋予一个实体或者值对象,且该操作又对业务流程很重要时,我们往往需要使用领域服务 通过A和B,得到一个C。

69910

ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证

href属性上; 跟多的时候,我们会像下面这样使用锚点属性 Speaker Detail  编译过之后...,上面的链接是这样的 Speaker Detail  这很好的把action和controller分开了 下面我们看看把实体提交到数据库的代码...return Page(); } _context.Movie.Add(Movie); await _context.SaveChangesAsync.../Index"); } }} 一般我们OnGet方法中初始化页面需要的状态数据; 这个页面没有状态数据需要初始化,所以我们就不用做任何事情 Page()方法返回一个PageResult...该对象负责渲染这个页面; Movie属性被标记了BindProperty标记,说明它是一个“模型绑定”对象; 当表单提交过来的时候,asp.net core负责把表单提交的数据,绑定到这个对象上; 表单提交之后

1.6K50
领券