Entity framework 实体框架:提交前如何检查值是否存在

Entity framework 实体框架:提交前如何检查值是否存在,entity-framework,repository-pattern,Entity Framework,Repository Pattern,我正在使用存储库模式 我有一个使用服务提交的国家/地区存储库。我应该在哪里检查数据库中是否已经存在该国家,我抛出一个异常 有没有一种方法可以在一个数据库调用中实现这一点?(如果不存在,请勾选并插入)?如果这是可能的,可以在服务层中完成吗?(如果这是您建议我进行检查的地方)。是否将这种逻辑放在您的服务或存储库中是一个有点主观的问题。就我个人而言,如果服务不存在,我会进行检查和插入,但在尝试进行插入之前,我也会让您的存储库验证它不存在,这样您的存储库就会强制执行一些“逻辑”,以防止您的数据库充满重复

我正在使用存储库模式

我有一个使用服务提交的国家/地区存储库。我应该在哪里检查数据库中是否已经存在该国家,我抛出一个异常


有没有一种方法可以在一个数据库调用中实现这一点?(如果不存在,请勾选并插入)?如果这是可能的,可以在服务层中完成吗?(如果这是您建议我进行检查的地方)。

是否将这种逻辑放在您的服务或存储库中是一个有点主观的问题。就我个人而言,如果服务不存在,我会进行检查和插入,但在尝试进行插入之前,我也会让您的存储库验证它不存在,这样您的存储库就会强制执行一些“逻辑”,以防止您的数据库充满重复

怎么做

public void InsertIfNonExistant(string Country)
{
   if(!_myContext.Countries.Any(c=>c.Name == Country))
      InsertNewCountry(Country);
}

是否将这种逻辑放在您的服务或存储库中是一个有点主观的问题。就我个人而言,如果服务不存在,我会进行检查和插入,但在尝试进行插入之前,我也会让您的存储库验证它不存在,这样您的存储库就会强制执行一些“逻辑”,以防止您的数据库充满重复

怎么做

public void InsertIfNonExistant(string Country)
{
   if(!_myContext.Countries.Any(c=>c.Name == Country))
      InsertNewCountry(Country);
}

由于多用户并发,您不能
选择
,然后
插入
,并保证不会出现问题。因此@Coding Gorilla提出的解决方案在高并发情况下可能会失败


您应该在相应的DB列上放置一个
唯一的
索引,并处理(或浮出水面)如果国家/地区存在您将得到的DB异常。是的,您可以在服务层中执行此操作。这只是一个DB调用,它永远不会失败,因为DB服务器会保护您免受并发问题的影响。

由于多用户并发,您不能
选择
然后
插入
,并保证不会出现问题。因此@Coding Gorilla提出的解决方案在高并发情况下可能会失败


您应该在相应的DB列上放置一个
唯一的
索引,并处理(或浮出水面)如果国家/地区存在您将得到的DB异常。是的,您可以在服务层中执行此操作。这只是一个DB调用,它永远不会失败,因为DB服务器保护您不受并发问题的影响。

您是说让EF抛出错误,只调用服务层中的Insert?我不必写任何检查?如果违反
唯一约束,DB服务器将返回错误。当这种情况发生时,EF将抛出。您是说让EF抛出错误,然后只调用服务层中的Insert吗?我不必写任何检查?如果违反
唯一约束,DB服务器将返回错误。发生这种情况时,EF将抛出。