在 C# 中使用 Entity Framework Core 插入数据之前检查重复字符串数据的最佳实践

Posted

技术标签:

【中文标题】在 C# 中使用 Entity Framework Core 插入数据之前检查重复字符串数据的最佳实践【英文标题】:Best practice to check duplicate string data before insert data using Entity Framework Core in C# 【发布时间】:2022-01-24 05:16:11 【问题描述】:

我需要关于我的代码的建议。我想要做的是在 ASP.NET Core 中使用 Entity Framework Core 在表中插入一行。

在插入新数据之前,我想检查电子邮件和电话号码是否已被使用。

我想具体返回,例如如果 return = x,则使用电子邮件。如果 return = y,则使用电话。

这是我的代码

public int Insert(Employee employee)

    var checkEmail = context.Employees.Single(e => e.Email == employee.Email);

    if (checkEmail != null)
    
        var checkPhone = context.Employees.Single(e => e.Phone == employee.Phone);

        if (checkPhone != null)
        
            context.Employees.Add(employee);
            context.SaveChanges();
            return 1;
        

        return 2;
    

    return 3;

我不确定我的代码,对我的情况有什么最佳实践建议吗?

【问题讨论】:

【参考方案1】:

我只是不喜欢这些表明你检查结果的“神奇数字”......你好吗,或者其他人如何知道12 的含义,6 个月后从现在开始的路??

我建议或者至少创建一个常量类,让这些数字的含义更加明显:

public class CheckConstants

    public const int Successful = 1;
    public const int PhoneExists = 2;
    public const int EmailExists = 3;

然后在你的代码中使用这些常量:

public int Insert(Employee employee)

    var checkEmail = context.Employees.Single(e => e.Email == employee.Email);

    if (checkEmail != null)
    
        var checkPhone = context.Employees.Single(e => e.Phone == employee.Phone);

        if (checkPhone != null)
        
            context.Employees.Add(employee);
            context.SaveChanges();

            return CheckConstants.Successful;
        

        return CheckConstants.PhoneExists;
    

    return CheckConstants.EmailExists;

以及在任何调用此方法并需要了解返回状态码的代码中。

或者,您也可以将其更改为 枚举(而不是 int):

public enum CheckConstants

    Successful, PhoneExists, EmailExists

然后从您的方法中返回这个枚举 - 而不是 int

public CheckConstants Insert(Employee employee)

    var checkEmail = context.Employees.Single(e => e.Email == employee.Email);

    if (checkEmail != null)
    
        var checkPhone = context.Employees.Single(e => e.Phone == employee.Phone);

        if (checkPhone != null)
        
            context.Employees.Add(employee);
            context.SaveChanges();

            return CheckConstants.Successful;
        

        return CheckConstants.PhoneExists;
    

    return CheckConstants.EmailExists;

【讨论】:

感谢您的反馈。我认为我的代码是一样的,但不同的是我们需要定义一个常量来处理返回类型。【参考方案2】:

    将两个数据库检查合并为一个查询

    使用 SingleOrDefault 实例

    public int Insert(Employee employee)
    
        var checkEmail = context.Employees.Select (e=>new e.Email , e.Phone ).SingleOrDefault(e => e.Email == employee.Email || e.Phone == employee.Phone);
    
        if (checkEmail == null)
        
            context.Employees.Add(employee);
            context.SaveChanges();
            return 1;
        
        else if (checkEmail.Email == employee.Email)
            return 3;
        else
            return 2;
    
    

【讨论】:

以上是关于在 C# 中使用 Entity Framework Core 插入数据之前检查重复字符串数据的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

C# Entity Framework中的IQueryable和IQueryProvider详解

C# Entity Framework中的IQueryable和IQueryProvider详解

C# Entity Framework 迁移,使 ID 自动递增

在 C# Entity Framework 中阅读 Oracle SYS_REFCURSOR?

Linux 上的 C# DotNet Entity Framework Core Migrations 错误

C# Entity Framework Core Migrations 最佳实践