获取错误“无法添加已存在的实体”。在没有过程的情况下将表的值插入到DB中

时间:2012-12-03 13:54:33

标签: c# linq

我正在将一个记录列表插入到DB表中,Linq to sql如下:

//my DataContext Class
 using (VTMMedicalDBDataContext objVTMMedicalDBDataContext = new VTMMedicalDBDataContext())
 {
     ReadOnlyCollection<TimeZoneInfo> objTimeZones = null;

     objTimeZones = TimeZoneInfo.GetSystemTimeZones();

     if (objTimeZones.Count > 0)
     {
         //List<TimeZoneMaster> listTimeZones = new List<TimeZoneMaster>();
         TimeZoneMaster objTimeZoneMaster = new TimeZoneMaster();

         foreach (var timezone in objTimeZones.ToList())
         {

             objTimeZoneMaster.TimeZoneName = timezone.DisplayName;

             var localName = timezone.DisplayName;

             objTimeZoneMaster.TimeZoneOffsetInMinutes = Convert.ToInt32(timezone.BaseUtcOffset.TotalMinutes);                      


             objVTMMedicalDBDataContext.TimeZoneMasters.InsertOnSubmit(objTimeZoneMaster);
             objVTMMedicalDBDataContext.SubmitChanges();


         }

     }
}   

我有一个主键,但我已经把它作为AutoGeneratd在DBML Nullable中为true,因为假。我无法摆脱它...请建议一些方法。

5 个答案:

答案 0 :(得分:8)

最后经过多次麻烦后,我得到了一个新概念的答案..

对于所有面临类似问题的人来说,这是一个明确的解决方案:

您需要创建“Table”类的对象(要在DB中更新的对象), 在循环 *为每个,for或任何其他..)内部,以便不更新相同的记录,每个对象使用不同的内存位置(因为本地实例在内部被破坏)仅循环..) *

答案 1 :(得分:3)

  

我有一个主键,但我已经在DBML

中将其设为AutoGenerated为true

那很好,但是,您是否已在数据库级别自动生成该字段? DBML级别的AutoGenerated实际上不会为您生成任何值,它只是向模型指示该值将由存储提供程序生成(因此它可能省略将其作为查询的一部分发送)。

答案 2 :(得分:1)

您必须更新表以使该列具有标识值(自动增量)。

然后更新您的DBML模型 - &gt;从DBML设计器中删除表,在服务器资源管理器中刷新表,然后再次拖放表对象。生成项目,它应该工作得很好。

答案 3 :(得分:0)

作为替代方法,您可以在db中调用存储过程来执行插入操作: Updating database by using stored procedures.

答案 4 :(得分:0)

使用(VTMMedicalDBDataContext objVTMMedicalDBDataContext = new VTMMedicalDBDataContext())  {      ReadOnlyCollection objTimeZones = null;

 objTimeZones = TimeZoneInfo.GetSystemTimeZones();

 if (objTimeZones.Count > 0)
 {
     //List<TimeZoneMaster> listTimeZones = new List<TimeZoneMaster>();


     foreach (var timezone in objTimeZones.ToList())
     {
          TimeZoneMaster objTimeZoneMaster = new TimeZoneMaster();

         objTimeZoneMaster.TimeZoneName = timezone.DisplayName;

         var localName = timezone.DisplayName;

         objTimeZoneMaster.TimeZoneOffsetInMinutes = Convert.ToInt32(timezone.BaseUtcOffset.TotalMinutes);                      


         objVTMMedicalDBDataContext.TimeZoneMasters.InsertOnSubmit(objTimeZoneMaster);
         objVTMMedicalDBDataContext.SubmitChanges();


     }

 }

}