【问题标题】:C# .Net Linq adding new record with identity fieldC# .Net Linq 添加带有标识字段的新记录
【发布时间】:2025-12-24 22:45:07
【问题描述】:

我有一张来自数据库模型的电话号码表。该表有一个主键 phoneId 和一个“自动增量”值。我需要插入一个新行,但表的模型版本没有可以为空的 phoneId 成员。如何指定新记录应获取下一个自动增量/标识号?

我正在尝试:

    var newPhone = new Phone() {
        PhoneId = null,
        PhoneNumber = newNumber
    };

    try {
        pdb.Phones.Add(newPhone);
        pdb.SaveChanges();
    } catch (Exception e) {
        Console.WriteLine("COULD NOT ADD new number: {0}", e.Message);
    }

在模型PhoneId 中是“长”而不是“长?”。如果不需要,我不想更改模型。如果我重建模型,我将失去更改,并且可能会忘记我为什么需要它。

我尝试复制模型 Phone 类并将该版本的 PhoneId 设置为可为空,但随后 Linq .Add() 方法因无法将一个转换为另一个而停止。

我错过了什么?

【问题讨论】:

  • 不要为 PhoneID 分配任何值...省略它。当你插入它时,数据库会给它它的值。
  • 谢谢,我回办公室试试。
  • 我编辑了你的标签。请记住,Entity Framework 和 LINQ-to-SQL 是两种相互排斥的技术。如有疑问,请阅读标签说明。
  • 你能把Phone.cs里面的内容包括进来吗?

标签: c# .net linq linq-to-entities


【解决方案1】:

您不必设置字段, 提交模型时该字段被初始化

var newPhone = new Phone() {
        PhoneNumber = newNumber
    };

try {
    pdb.Phones.Add(newPhone);
    pdb.SaveChanges();
} catch (Exception e) {
    Console.WriteLine("COULD NOT ADD new number: {0}", e.Message);
}

【讨论】:

    【解决方案2】:

    模型没有phoneID,因为数据库会在您插入记录时设置该值。主键也不能为空。

    More about Identity fields

    查看示例 A:在上面的链接中...您会看到他们省略了 IDENTITY 字段。

     var newPhone = new Phone(); 
     newPhone.PhoneNumber = newNumber;
    
     try 
     {
        pdb.Phones.Add(newPhone);
        pdb.SaveChanges();
     }
     catch (Exception e) 
     {
        Console.WriteLine("COULD NOT ADD new number: {0}", e.Message);
     }
    

    【讨论】: