C# 在插入之前是否应验证相关实体是否存在?

C# 在插入之前是否应验证相关实体是否存在?,c#,entity-framework,domain-driven-design,C#,Entity Framework,Domain Driven Design,我正在使用领域驱动设计和实体框架。 在呼叫保存之前,我是否应该通过sale.CustomerId验证客户是否存在?我通常不会这样做。通常,这些信息来自以前加载的客户端(它存在)。但是,在某些情况下,更新数据库时,CustomerId丢失 由于多个用户同时访问系统时的并发性。但这种情况应该使用乐观并发控制(版本)有选择地解决。我们通常不会在所有情况下都尝试处理并发性,因为这样做几乎是不可能的,而且这样做也会带来诸如性能问题、复杂性等副作用,。。。我们只关注系统中的一些关键代码,如果存在并发问题,

我正在使用领域驱动设计和实体框架。
在呼叫保存之前,我是否应该通过sale.CustomerId验证客户是否存在?

我通常不会这样做。通常,这些信息来自以前加载的客户端(它存在)。但是,在某些情况下,更新数据库时,
CustomerId
丢失

  • 由于多个用户同时访问系统时的并发性。但这种情况应该使用乐观并发控制(版本)有选择地解决。我们通常不会在所有情况下都尝试处理并发性,因为这样做几乎是不可能的,而且这样做也会带来诸如性能问题、复杂性等副作用,。。。我们只关注系统中的一些关键代码,如果存在并发问题,这些代码将导致问题

  • 客户端试图通过发送不适当的
    客户ID
    来入侵系统。但这是另一个问题,应该根据授权或类似的内容进行检查


在大多数情况下,我认为db中的外键约束就足够了。

分布式系统怎么样?@plalx:分布式系统是什么意思:分布式数据库还是分布式应用服务器?在分布式应用服务器的情况下,不应该有任何区别,因为来自每个服务器的请求不应该与db server视点不同想象用户正在进行销售和选择客户。另一个用户删除了第一个用户选择的客户。当第一个用户尝试保存时,将生成外键错误。考虑到这一点,为了尽量减少案例,我想我应该添加一个“已删除”列,而不是删除记录。这样做合适吗?一个副作用是,我必须为唯一列创建筛选索引。@KhanhTO我指的是分布式数据库和应用程序服务器。在这种情况下,您不能真正依靠外键来执行此类策略。@Vinicius Gonçalves:这就是并发控制的情况。如果不删除记录,只需将其标记为“已删除”,那么我不确定在这种情况下是否有任何方法可以使外键工作。通过将行加载到应用程序服务器中使用常规检查也不起作用,因为在应用程序服务器上加载行时,其他用户可能仍然能够删除该行。在这种情况下,您可能需要使用lock加载行
,以确保没有其他人可以访问该行。
class Customer
{
    public int Id { get; set; }
}

class Sale
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
}

class SaleService
{

    public void NewSale(Sale sale)
    {
        //Should i validate if Customer exists by sale.CustomerId before call save?

        saleRepository.InsertOrUpdate(sale);
    }
}