小编Jef*_*eff的帖子

构建一个可以在 net6.0 运行时运行的 net5.0 目标应用程序

我之前认为 net6.0 运行时是向后兼容的,因为 net5.0 应用程序将按原样运行,但这不是我在测试中看到的。我的开发系统使用的是VS2019,所以不支持net6.0 SDK。我尝试手动将 TargetFramework 标记转换为 TargetFrameworks 并添加 net5.0;net6.0,但它无法构建。我想要某种表示 5 或更高版本的 net5.0+ 标签,但我也找不到。

但是,为什么当部署到仅具有 net6.0 运行时的系统时,TargetFramework 设置为 net5.0 不起作用?假设我的应用程序是在 net6.0 存在之前构建的。我不想在 net6.0 发布时必须发布新的软件包。这是否需要客户无限期地安装 net5.0 以继续支持我的应用程序?

我觉得我错过了一些简单的东西,但经过几个小时的阅读后,我并没有更接近弄清楚它。

.net-core .net-5 .net-6.0

6
推荐指数
1
解决办法
2728
查看次数

使用EF Core和MySQL实现行版本的更好方法是什么?

如果我在我的模型中使用以下字段:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Timestamp]
public DateTime RowVersion { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后将列定义为

`RowVersion` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

我从EF获得了正确的乐观并发行为.也就是说,我对使用时间戳感到很兴奋,因为它似乎只是第二个分辨率.虽然有2个客户尝试在1秒内更新同一记录的可能性很大,但肯定会发生,不是吗?

因此,考虑到这一点,我更喜欢一个简单的整数,在每次更新时以原子方式递增1.这样就不可能错过冲突.我把我的定义改为:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Timestamp]
public long RowVersion { get; set; }
Run Code Online (Sandbox Code Playgroud)

问题是,MySQL不会自动增加它.所以我创建了一个触发器:

CREATE TRIGGER update_row_version BEFORE UPDATE on client 
FOR EACH ROW
SET NEW.RowVersion = OLD.RowVersion + 1;
Run Code Online (Sandbox Code Playgroud)

现在这一切都有效.EF在需要时抛出DbUpdateConcurrencyException,并且由于时间窗口而不可能错过更新.但是,它使用触发器,我继续阅读它们对性能有多糟糕.

那么还有更好的方法吗?也许某种方法来覆盖DbContext的SaveChanges()来在客户端上执行RowVersion增量,因此只对DB进行一次更新(我假设触发器实际上每次都进行两次更新)?

c# mysql entity-framework-core asp.net-core

5
推荐指数
1
解决办法
2397
查看次数