C# 获取错误“;无法添加已存在的实体。”;插入表格时';无需过程,将s值转换为DB
我使用Linq to sql将记录列表插入DB表,如下所示:C# 获取错误“;无法添加已存在的实体。”;插入表格时';无需过程,将s值转换为DB,c#,linq,C#,Linq,我使用Linq to sql将记录列表插入DB表,如下所示: //my DataContext Class using (VTMMedicalDBDataContext objVTMMedicalDBDataContext = new VTMMedicalDBDataContext()) { ReadOnlyCollection<TimeZoneInfo> objTimeZones = null; objTimeZones = TimeZoneInfo.Ge
//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();
}
}
}
//我的DataContext类
使用(vtmedicaldbatacontext objvtmedicaldbatacontext=new vtmedicaldbatacontext())
{
ReadOnlyCollection objTimeZones=null;
objTimeZones=TimeZoneInfo.GetSystemTimeZones();
如果(objTimeZones.Count>0)
{
//List listTimeZones=新列表();
TimeZoneMaster objTimeZoneMaster=新的TimeZoneMaster();
foreach(objTimeZones.ToList()中的var时区)
{
objTimeZoneMaster.TimeZoneName=timezone.DisplayName;
var localName=timezone.DisplayName;
objTimeZoneMaster.TimeZoneOffsetInMinutes=转换为32(时区.BaseUtcOffset.TotalMinutes);
objvtmedicaldbdatacontext.TimeZoneMasters.InsertOnSubmit(objTimeZoneMaster);
objvtmedicaldbdatacontext.SubmitChanges();
}
}
}
我有一个主键,但我已经将它在DBML中自动生成为true,可以为null,也可以为false。但我仍然无法消除它…请建议一些解决方法。您必须更新表,使该列具有标识值(自动增量) 然后更新DBML模型->从DBML设计器中删除表,在服务器资源管理器中刷新表,然后再次拖放表对象。生成项目,它应该工作得很好 我有一个主键,但我已经在DBML中使其自动生成为true
这很好,但是,您是否在数据库级别自动生成了字段?DBML级别的自动生成实际上不会为您生成任何值,它只是向模型表明该值将由存储提供程序生成(因此它可能会忽略将其作为查询的一部分发送)。经过许多麻烦之后,我终于用一个新概念得到了答案 对于所有面临类似问题的人,这里有一个明确的解决方案: 您需要创建“Table”类的对象(要在DB中更新哪个对象),
在循环内部(*for each、for或任何其他..),以便不更新相同的记录,并且每个对象使用不同的内存位置(因为本地实例仅在循环内部被销毁..)*作为替代方法,您可以调用db内部的存储过程,该存储过程将执行插入操作: 使用(vtmedicaldbdatacontext objvtmedicaldbdatacontext=new vtmedicaldbdatacontext()) { 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();
}
}
objTimeZones=TimeZoneInfo.GetSystemTimeZones();
如果(objTimeZones.Count>0)
{
//List listTimeZones=新列表();
foreach(objTimeZones.ToList()中的var时区)
{
TimeZoneMaster objTimeZoneMaster=新的TimeZoneMaster();
objTimeZoneMaster.TimeZoneName=timezone.DisplayName;
var localName=timezone.DisplayName;
objTimeZoneMaster.TimeZoneOffsetInMinutes=转换为32(时区.BaseUtcOffset.TotalMinutes);
objvtmedicaldbdatacontext.TimeZoneMasters.InsertOnSubmit(objTimeZoneMaster);
objvtmedicaldbdatacontext.SubmitChanges();
}
}
}你的主键是什么类型的?@James:是整数类型。我想你的主键也是在DB级别自动递增的?嗯……你用的是哪个后端DB?我假设它是SQL server,但只是为了清楚起见。另外,您至少插入了一条记录。该记录的主键值是多少?是否正在生成?@James Yes James,我正在插入一条ID为1的记录,但我相信它不会在服务器端更新ID,因为只需在第二个InsertOnSubmit之前检查值,我发现ID仅在aspx.cs文件结尾处存在。。!!我无法获取答案中的最后一行…你想让我将O作为默认值传递给整数列吗???@Rahullanjan“你想让我将0作为默认值传递吗”-不,我不是这么说的。我删除了这一行,因为它使答案复杂化了。通过MGMT Studio添加新记录时,主键是否会增加?这纯粹是一个Linq2SQL问题吗?哈哈,当然,我太关注DBML了,以至于没有实际查看您的代码+1解决这个问题做得很好。一旦你插入了记录,它就会被附加到DataContext,所以你不能重复使用它。这救了我!!!好兄弟!!我有一个从列表添加到数据库的类似实现。得到的错误与您面临的完全相同,经过6个小时的调试,我终于完成了:)请解释为什么您的解决方案解决了最初提问者的问题。