/public static ILog Log = LogManager.GetLogger(typeof(T).Name); /// /// 返回上下文实体.../// 更新的值 如:u=>new User{FirstName = "newfirstname"} /// 返回影响的条数.../// 更新的值 如:u=>new User{FirstName = "newfirstname"} /// 返回影响的条数...} #endregion #region ===事务==== /// /// 运行基本事务,返回...return -1; } } #endregion } } ..求大神指点一下..哪里有问题..我在改改
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;// 获取当前的事务就是返回存储的私有对象
值得推荐的.NET ORM框架 对于还不知道怎么选择.NET ORM框架的同学可以看下面这两篇文章,希望对你会有所帮助。...支持选择是否要跟踪你的查询实体/实体。 支持在确实需要时重置你的EF Core DbContext状态。 具有完整的单元测试支持。 支持分页、原始SQL查询支持复杂类型和原始类型。...= "new_updated@example.com"; _repository.Update(newUser); await _repository.SaveChangesAsync...(); // 删除用户 _repository.Remove(newUser); await _repository.SaveChangesAsync...{user.Id}, Name: {user.Name}, Age: {user.Age}, Email: {user.Email}"); } } } 在Program.cs
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类型的列其生成新值。
按照之前的做法,我们可以通过在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
但是一个导航属性也能返回一个集合(一对多或者多对多的 关系)。...这个方法返回关联的实体——在这个实例中,就是一个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
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
三、创建对应数据库表的实体模型: 注意该篇博客使用的是手动模型优先的方式进行数据库表字段与模型属性映射,当然如果大家觉得这样子比较麻烦的话可以真正意义上的模型优先,直接创建模型在program.cs...上下文指定数据模型中包含哪些实体。 在此项目中将数据库上下文类命名为 SchoolUserInfoContext。...在定义 DbSet 属性的代码之后,添加下面代码,对DbContext指定单数的表名来覆盖默认的表名。..._shoSchoolUserInfoContext.UserInfos.Add(userInfo); await _shoSchoolUserInfoContext.SaveChangesAsync...shoSchoolUserInfoContext.UserInfos.Update(userInfo); await _shoSchoolUserInfoContext.SaveChangesAsync
问题 既然上面提到了一致性问题,那具体的问题是什么呢,在什么情况才会发生呢?我想我有必要简单举例。...如果服务在数据库更新后崩溃(奔溃发生在_context.SaveChangesAsync()代码执行之后,但又发生在集成事件成功发布前),就会导致本地微服务价格已成功更新,但集成事件未发布的问题。...其他微服务通过在启动类中注册IntegrationEventLogContext即可完成事件日志的集成。...如何借助事件日志确保高可用 主要分两步走: 应用程序开始本地数据库事务,然后更新领域实体状态,并将集成事件插入集成事件日志表中,最后提交事务来确保领域实体更新和保存事件日志所需的原子性。...发布事件 第一步毋庸置疑,第二步发布事件,我们又有多种实现方式: 在提交事务后立即发布集成事件,并将其标记为已发布。当微服务发生故障时,可以通过遍历存储的集成事件(未发布)执行补救措施。
Clear(); } 将领域事件做一个实体的属性存储进来,它应该是一个列表,因为在一个实体操作过程中间可能会发生多件事情,领域事件应该是可以被实体模型之外的代码读到,所以暴露一个 ReadOnly 的...可以看到我们先进入到了创建订单的处理系统(CreateOrderCommandHandler),接着进入到了领域事件发布的 Publish 的代码(MediatorExtension),当仓储存储完毕之后...,进入到了 OrderCreatedDomainEventHandler,也就是说我们在创建完我们的领域模型并将其保存之后,我们的领域事件的处理程序才触发 在之前讲解实现 UnitOfWork 的时候(...EFContext),我们的 SaveEntitiesAsync 里面只有一行代码是 SaveChangesAsync,这里添加了一行代码,是发送领域事件的代码 DispatchDomainEventsAsync...,然后从跟踪到的实体的对象中获取到我们当前的 Event,如果 Event 是存在的,就把它取出来,然后将实体内的 Event 进行清除,再然后将这些 Event 逐条地通过中间件发送出去,并且找到对应的
前文索引: 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
(该部分内容本文将不做过多介绍) 虽然析构函数方法在某些需要进行清理的情况下是有效的,但它有下面两个严重的缺点: 只有在GC检测到某个对象可以被回收时才会调用该对象的终结方法,这发生在不再需要资源之后的某个不确定的时间...在以往同步版本的代码中,我们往往会选择SaveChanges同步方法。 当来到了异步的环境,我们往往会选择SaveChangesAsync。...所以在AspNet Core这个全流程异步的大环境下,我们的代码潜移默化的就会更改为SaveChangesAsync。...在.NET 5 之后,大部分的类都具有了IAsyncDisposable的实现。...为什么会有这样的结果呢? 让我们一起来扒开它的面纱。
最后,所有这些操作都是在等待数据库返回结果时(在本例中)让其他请求使用当前线程。...这样,我们就不会有空闲的“worker”(线程)在那里等待完成其他任务。这就像去快餐店一样,在你点完菜之后,其他人不会点任何东西,直到你吃完为止。...代码的作用类似于“同步”,因为您可以在await之后以本方法继续执行代码。因此,如果在一个方法中有四个await,则必须等到每个方法都完成后才能调用下一个方法。...注意:如果需要language/culture,可以始终在await之前存储当前相关状态值,然后在await新线程之后重新应用它。...另一个问题是调用者永远不会知道它何时结束,因为它不返回任何东西。因此,如果你关心什么时候完成某个Task,那么实际上需要返回一个Task。
实在忍不住,于是起床开电脑在咳嗽声中进行了一番体验。...使用 在安装完插件后,随便打开一个项目,随便选择一个类,右键就有"询问 Copilot" 菜单: 点击菜单后,下面就会出现一个对话框: 用户可以在对话框进行提问 同时在侧边栏也会多出一个...minjie: 生成一个ToDo实体类 Copilot: public class ToDo { public int Id { get; set; } public string...following code to ConfigureServices method services.AddScoped(); minjie: 可以把以上对话整理成一篇文章吗?...我们创建一个名为 TodoContext 的类,在其中我们将 ToDo 实体框架创建为数据库表。同时还将添加一个连接字符串以及一些模型构建代码。
“->”运算符返回 JSONB 对象/数组,而“->>”返回文本。...SELECT jsonb_each(details) FROM products; jsonb_each_text 与 jsonb_each 类似,但以文本形式返回所有值。...定义实体 我们的主要实体是产品,代表我们库存中的商品。...db.Products.FirstAsync(); productToUpdate.Translations["de"] = "Ergonomischer Stuhl"; await db.SaveChangesAsync...通过了解如何使用 JSONB 属性定义实体、配置上下文和执行 CRUD 操作,开发人员可以显著增强其应用程序的数据管理功能。
/// 树形结构实体的集合 /// 树形结构实体的根结点 /// 树形结构实体的集合 /// 多个树形结构实体根结点的集合</returns...此外,我在我的模板里做了约定,不在Repository里面进行任何的提交保存等动作。...所有的Model都是转化成ViewModel之后再传送到前台,所有前台提交过来的对象数据,大多是作为ViewModel传进来的。...i.所有后台翻页返回的结果应该是使用PaginatedItemsViewModel。 里面有很多例子,请参考。 注意:项目启动后显示错误页,因为我把Home页去掉了。
由此我们可以推导出:在领域驱动设计建模过程中,如果发现有一项动作发生了之后,与之关联的其他领域对象将会受到波及。 那么该动作可能就是“领域事件”。...所以我们可以很自然的将目光转向到“购物车”,“购物车”可能就是一个聚合根,它会有一个叫做“添加商品”的行为,当该行为完成之后就会引发一个“商品添加完成”的事件。...就好比“推荐商品”受到了“商品添加完成”事件之后,它自己也能产生一个另外的领域事件传递给下游。 思维的转换 到这里您或许会感到使用领域事件和以往咱们捕获其他对象不太一样,比如捕获值对象、实体等。...当Evans在初次提出领域驱动的概念时,是没有考虑领域事件的,那么也就意味着我们能够通过原有的领域对象完成领域建模和业务流程。 回到刚才那个问题,聚合与聚合之间只能通过事件完成操作吗?不一定。...先回顾一下咱们在领域服务章节了解到的部分内容: 当我们发现一个操作无法赋予一个实体或者值对象,且该操作又对业务流程很重要时,我们往往需要使用领域服务 通过A和B,得到一个C。
虽然refresh token也无法直接控制jwt失效,但是在refresh token机制下,我们可以把token的有效期设置的短一些,比如30分钟,而refresh token的有效期可以很长;因为...很多人纠结的jwt滑动刷新,无感刷新,在refresh token机制下,都不是问题。...生成refresh_token 改造一下上一篇的代码,首先refresh token需要持久化到数据库中,定义实体: public class RefreshToken { [Key]...GenerateRandomNumber() }; await _appDbContext.RefreshTokens.AddAsync(refreshToken); await _appDbContext.SaveChangesAsync...storedRefreshToken.Used = true; //_userDbContext.RefreshTokens.Update(storedRefreshToken); await _appDbContext.SaveChangesAsync
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负责把表单提交的数据,绑定到这个对象上; 表单提交之后
todoItem.IsComplete = false; _todoContext.TodoItems.Add(todoItem); await _todoContext.SaveChangesAsync...todoItem) { _todoContext.TodoItems.Remove(todoItem); await _todoContext.SaveChangesAsync...todoItem) { _todoContext.TodoItems.Update(todoItem); await _todoContext.SaveChangesAsync...唯一需要了解的是,OnInitialized 和 OnInitializeAsync 事件是在做组件的初始化,它发生在参数注入完成之后(这里的ITodoItemService就是注入的参数)。...这些指令返回重复的标记块。它们的工作方式与等效的 C# for、while 和 do...while 循环类似。
领取专属 10元无门槛券
手把手带您无忧上云