{“当identity_insert设置为OFF时,无法为表';Cantact';中的标识列插入显式值.”}

本文关键字:Cantact 标识 插入 insert identity 设置 OFF | 更新日期: 2023-09-27 18:21:38

我正试图在我的程序中保存一个联系人,这是一个简单的C#电话簿,我正在使用linq&实体框架&当我想添加或更改任何数据时,我会收到运行时错误

当identity_insert设置为OFF时,无法在表"Contact"中插入标识列的显式值。

这是我的insert(添加)代码,另一方面,我不想在我的主键ID中添加任何数据,我想把它留给我的SQL Server。

谢谢大家帮助我

public void Save()
{
    using (var Contex = new Phone_BookEntities1())
    {
        var p = from c in Contex.Cantacts
                where c.Cantact1 == Name
                select new { c.Cantact1, c.Number };
        if (!p.Any())
        {
            Ref_Cantact = new Cantact();
            Ref_Cantact.Cantact1 = Name;
            Ref_Cantact.Number = Num;
            Contex.Cantacts.Add(Ref_Cantact);
            Contex.SaveChanges();
        }
    }
} 

编辑

public partial class Cantact 
{ 
    public string Cantact1 { get; set; } 
    public string Number { get; set; } 
    public int ID { get; set; } 
} 

{“当identity_insert设置为OFF时,无法为表';Cantact';中的标识列插入显式值.”}

您可以这样做;

    public void Save(string Name, string Num)
    {
          using(var context =  new Phone_BookEntities1())
          {
               var existingContacts = Context.Cantacts.Where( c=>c.Cantact1 == Name); //there can be many contacts with the same name. Use FirstOrDefault and also improve the filtering   criteria
               if(existingContacts.Any())
               {
                    foreach(var contact in existingContacts)
                    {   
                         contact.Number = Num;
                    }
               }else
               {    
                      var Ref_Cantact =  new Cantact(){Cantact1 = Name, Number = Num};
                     context.Cantacts.Add(Ref_Cantact);
               }
               Contex.SaveChanges();
         }
    }

您可以尝试这样做:这将包装事务中的所有调用,因此为insert语句设置identity insert(由EF在调用Add+SaveChanges时创建)。

if (!p.Any())
            {
                Ref_Cantact = new Cantact();
                Ref_Cantact.Cantact1 = Name;
                Ref_Cantact.Number = Num;
                using(var trans=Contex.Database.BeginTransaction())
                {
                    Contex.Database.ExecuteSqlStatement("SET IDENTITY_INSERT Contact ON;");
                    Contex.Cantacts.Add(Ref_Cantact);
                    Contex.SaveChanges();
                    trans.Commit();
                }
            }

编辑:另一种可能性是关闭AutoIncrement(DatabaseGeneratedOption.Identity),使用(在上下文类(或where ever)中的模型生成器中):

modelBuilder.Entity<Cantacts>().Property(x=>x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

我需要更新我的模型中的.edmx类