{“当IDENTITY_INSERT设置为OFF时,无法在表'Cantact'中为标识列插入显式值。”}

时间:2015-11-11 06:31:27

标签: c# entity-framework

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

  

当IDENTITY_INSERT设置为OFF时,无法在表'Contact'中为identity列插入显式值。

这是我的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; } 
} 

3 个答案:

答案 0 :(得分:0)

你可以这样做;

    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();
         }
    }

答案 1 :(得分:0)

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

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):

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

答案 2 :(得分:0)

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