将唯一值从 EF 插入数据库

Posted

技术标签:

【中文标题】将唯一值从 EF 插入数据库【英文标题】:Inserting unique values to Database from EF 【发布时间】:2021-08-01 03:54:40 【问题描述】:

我正在使用 Razor 页面创建一个 CRUD 应用程序。我正在使用基于 SQL 的数据库。我不想让工具具有相同的工具编号。如果可能,异常处理将是理想的。获取一条消息,其中显示“工具编号已存在”等。

IDENTITY(1,1) 在编辑工具时收到以下错误消息:

SqlException:无法更新标识列“ToolNumber”。

UNIQUE 当我为两个工具设置相同的工具编号时,我收到以下错误消息:

SqlException:违反 UNIQUE KEY 约束“UQ__TOOL__F63D0498394D4BBD”。无法在对象“dbo.TOOL”中插入重复键。重复键值为 (1)。

这是我的Tool 实体:

public class Tool

    [Required(ErrorMessage = "RFID Kode kreves")]
    public long ToolId  get; set; 
    [Required(ErrorMessage = "Verktøynummer kreves")]
    public int ToolNumber  get; set; 
    [Required(ErrorMessage = "Model navn kreves")]
    [StringLength(20, MinimumLength = 3, ErrorMessage = "Maksimal lengde 20 bokstaver")]
    public string? Model  get; set; 
    public bool Borrowed  get; set; 
    [StringLength(20, MinimumLength = 3, ErrorMessage = "Maksimal lengde 20 bokstaver")]
    public string? Manufacturer  get; set; 
    [Required(ErrorMessage = "Verktøy kategori kreves")]
    [StringLength(20, MinimumLength = 3, ErrorMessage = "Maksimal lengde 20 bokstaver")]
    public string Category  get; set; 
    public long EmployeeId  get; set; 
    [StringLength(30, MinimumLength = 3, ErrorMessage = "Maksimal lengde 30 bokstaver")]
    public string? EmployeeName  get; set; 
    public string? Description  get; set; 
    [StringLength(20, MinimumLength = 3, ErrorMessage = "Maksimal lengde 20 bokstaver")]
    public string? SerialNumber  get; set; 
    public DateTime? DateOfPurchase  get; set; 
    public int? Reminder  get; set; 
    public string? Price  get; set; 
    [StringLength(10, MinimumLength = 0, ErrorMessage = "Maksimal lengde 10 bokstaver")]
    public string? Condition  get; set; 
    public DateTime? DateOfCalibration  get; set; 
    public string? CalibrationPlace  get; set; 
    public string? PhotoPath  get; set;         

这是我的 Add 方法:

public Tool Add(Tool newTool)

    context.TOOL.Add(newTool);
    context.SaveChanges();
    return newTool;

这是我的更新方法:

public Tool Update(Tool updatedTool)

    var tool = context.TOOL.Attach(updatedTool);
    tool.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
    context.SaveChanges();
    return updatedTool;

【问题讨论】:

同时拥有ToolIDToolNumber 有什么意义? 实际键是什么?如果是ToolID,为什么要使用IDENTITYToolNumber?事实上,为什么要使用ToolNumber 您是否考虑过为ToolNumber 使用序列?你在使用 SQL Server 吗?如果使用序列,则不需要异常处理(针对重复项)。 您好,这个项目的公司。他们想要 ToolNumber 和 TooID。与我一起工作的另一个学生希望 ToolId 成为主键。 ToolNumber 只是一个数字,用于分隔两个相同型号的工具。 ToolId 是该工具将拥有的 RFID 标签号。 【参考方案1】:

您可以在使用相同的 ToolNumber 添加/更新之前验证数据库中是否有任何工具并引发自定义异常。

public class DuplicatedException : Exception

    public DuplicatedException()
    
    

    public DuplicatedException(string message)
        : base(message)
    
    

    public DuplicatedException(string message, Exception inner)
        : base(message, inner)
    
    

方法:

public Tool Add(Tool newTool)

    if (context.TOOL.FirstOrDefault(t => t.ToolNumber == newTool.ToolNumber))
        throw new DuplicatedException("Toolnumber already exists");

    context.TOOL.Add(newTool);
    context.SaveChanges();
    return newTool;


public Tool Update(Tool updatedTool)

    if (context.TOOL.FirstOrDefault(t => t.ToolNumber == updatedTool.ToolNumber && t.ToolId != updatedTool.ToolId))
        throw new DuplicatedException("Toolnumber already exists");

    var tool = context.TOOL.Attach(updatedTool);
    tool.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
    context.SaveChanges();
    return updatedTool;

【讨论】:

我收到此错误:严重代码描述项目文件行抑制状态错误 CS0029 无法将类型“ToolInventory.Models.Tool”隐式转换为“bool”ToolInventory.Services D:\Programmer\Skole\Final\ CaverionLagerSystem - Admin\ToolInventory.Services\SQLToolRepository.cs 23 活动

以上是关于将唯一值从 EF 插入数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将表值从一个数据库插入到另一个数据库? [关闭]

使用 Google Apps 脚本将 Null 值从表格插入 Mysql 数据库

Pentaho 数据集成 (PDI):将布尔值从源插入到目标

EF Codefirst 验证唯一属性?

如何使用参数化输入将 NULL 值从 nodeJS/javascript 插入 MySQL?

如何一次将数据插入和更新到 EF 多个表中