【发布时间】:2019-04-20 22:55:58
【问题描述】:
在 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;
}
}
在我的 DbContext 中,我有这个代码字段/约束,可确保代码从持久性的角度来看是唯一的。
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Foo>()
.HasIndex(u => u.Code)
.IsUnique();
}
我希望我的服务类中的 addNewFoo 方法在添加之前确保我的应用程序中的所有 Foo 属性代码都是唯一的。
我尽我所能尊重坚持无知原则,但我并不像我希望的那样熟练。
对于初学者来说,确定 Code 字段是否唯一是 Builder 的角色吗?
其次,我知道在我的验证层中,我可以确定是否存在现有的 foo,其代码与我当前尝试添加的实际 foo 相同。但是这种方法不是线程安全的或事务性的。
事实是我不想等待我添加我的 foo 的那一刻也有一个 SqlException,只是知道它不能完成。
使用 牢记快速失败原则。
【问题讨论】:
-
除非您正在构建一个单用户系统,否则 no 数量的预检查可能会有所帮助,因为其他人可能 关于 插入重复的项目并且在您完成预检查和执行 实际 插入之间取得成功。你必须处理这个异常无论如何。为什么要添加更多代码/层。
-
@Damien_The_Unbeliever,我知道你在说什么,我只是希望有另一种方法来处理这个问题。而 SqlException 对原因也不是很友好。 (必须阅读 sql 结果代码......一种神奇的数字......)。
标签: c# design-patterns .net-core architecture ef-core-2.2