- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在aspnetcore mvc执行上下文中。
我有这个简单的实体。
public class Foo
{
public int Id { get; private set; }
public string Name{ get; private set; }
public string Code { get; private set; }
private Foo() { }
public Foo(string Name, string Code)
{
GuardClauses.IsNullOrWhiteSpace(Name,nameof(Name), "cannot be null or empty");
GuardClauses.IsNullOrWhiteSpace(Code, nameof(Code), "cannot be null or empty");
this.Nom = Nom;
this.Code = Code;
}
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Foo>()
.HasIndex(u => u.Code)
.IsUnique();
}
最佳答案
因为没有系统的具体示例或描述,所以我将进行概括。如果您提供具体示例,则可以添加其他信息。每个解决方案都有一个最适用的上下文,当然总会有一个折衷方案
让我们问几个有关本《守则》的性质及其代表什么的疑问
谁负责代码生成:系统用户还是系统本身?
代码可以完全随机(例如UUID)吗?
是由某些特殊算法(SSN或由具有特殊含义的不同部分组成的CarPartNumber)生成的代码吗?
还有一个非常重要的问题:
我们预计这些独特的违规行为会多久发生一次?
如果问题2的答案是“是”,那么您就没有问题。您可以有一个重复的UUID,但是机会很少。您可以为数据库添加一个唯一约束,以防万一,并将此违规视为您不关心的普通错误,因为它在一百万年后会发生一次。
如果问题3的答案是“是”,那么我们的情况就不同了。在多用户系统中,您无法避免并发。有两种处理场景的方法:
选项1:Optimistic Offline Lock
选项2:Pessimistic Offline Lock
选项3:如果系统正在生成代码,则具有特殊服务和队列代码生成请求。
如果选择使用锁定,则可以锁定整个资源Foo或仅锁定代码生成。
选项1:
您将必须处理SQLException。如今,该应用程序已在大多数应用程序中使用,因为它可确保不会因有人锁定资源而导致应用程序停滞大量时间,从而确保流畅的用户体验。
您可以使用抽象,例如存储库。定义您自己的应用程序级别的异常UniqueCodeViolationException,该异常将由存储库引发。当比较错误代码时,存储库将尝试{} catch {} SQLException,对其进行处理并将其包装在UniqueCodeViolationException中。这不会为您节省检查,但至少会隐藏具体错误,并且只在一个地方进行处理。
选项2:
有时您确实需要确保没有并发,因此您使用此选项。在这种情况下,您将只能锁定一个用户的Foo创建过程,并且如果存在锁定,则不允许其他用户打开创建Foo的对话框/表单/页面。
通过创建一个基本上对于面向同一Foo的多个用户不可用的系统,这可以确保一致性并避免该问题。您正在构建的应用程序很可能只有一个人负责Foo创建,或者并发性很低,因此这可能是一个很好的解决方案。
我有一些在保险应用程序中使用此锁的朋友。通常,在他们的申请中,一个人要去一个办公室进行保险。因此,为同一人创建保险的并发可能性非常低,但是为同一人购买多个保险的成本却很高。
选项3:
另一方面,如果您的代码是由系统生成的,则可以拥有一个CodeGenerationService来处理代码生成并确保生成唯一的代码。您可以将这些请求放在队列中。在服务中的每个生成操作中,您可以检查此代码是否存在并返回错误(或引发异常)。
现在问题4。如果您不希望经常发生冲突,只需在数据库中添加唯一约束并将其视为一般的意外错误即可。添加检查代码是否已经存在,如果存在则显示错误。
您仍然可以在此处进行并发操作,因此将有一个微小的变化,即一个用户将添加一个Foo,而另一个用户将收到错误消息“糟糕……有些错误,请重试”。因为这将在100年内发生一次,所以可以。
最后一种解决方案将忽略罕见情况下可能发生的特殊情况,从而使您的系统更加简单。
关于c# - 如何在我的业务逻辑层中管理统一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55629719/
我是一名优秀的程序员,十分优秀!