【问题标题】:LINQ won't insert all records in que (possible overwriting of records?)LINQ 不会在 que 中插入所有记录(可能覆盖记录?)
【发布时间】:2011-06-24 13:40:23
【问题描述】:

这是我的以下代码(以前可以使用)。它应该向上下文对象添加多条记录(我猜是 LINQ 案例中的对象),然后提交给数据库。问题是,现在只有一条记录进入数据库,而之前有几条记录被插入。

using (DeviceExerciseDataDataContext context = new DeviceExerciseDataDataContext())
{
    foreach(UpdateData tgudData in data.UpdateData)
    {
        tgd.FK = 1;
        tgd.Time = tgudData.TimeStamp;
        tgd.Calories = Convert.ToInt32(tgudData.Calories);
        tgd.HeartRate = tgudData.AvgHr;
        tgd.BenchAngle = tgudData.Angle;
        tgd.WorkoutTarget = 0;
        tgd.Reps = tgudData.Reps;
        context.Datas.InsertOnSubmit(tgd);
    }
    context.SubmitChanges();
}

现在,我尝试将 context.SubmitChanges() 放入 foreach 块中,这就是它给出的错误。

无法插入显式值 表中的标识列 'tablename' 当 IDENTITY_INSERT 是 设置为关闭。

请注意,我没有插入主键列,并且 PK 列设置为自动递增,并且是标识。

对我有什么想法,为什么我的代码不再插入多条记录?

【问题讨论】:

    标签: c# .net linq exception-handling


    【解决方案1】:

    您只为tgd 使用了一个类实例,因此只创建了一条记录——您只是在重复覆盖现有tgd 实例的属性。相反,您必须在循环内新建 tgd,即:

    foreach(UpdateData tgudData in data.UpdateData)
    {
        tgd = new WhateverTgdIs();
        tgd.FK = 1;
        tgd.Time = tgudData.TimeStamp;
        tgd.Calories = Convert.ToInt32(tgudData.Calories);
        tgd.HeartRate = tgudData.AvgHr;
        tgd.BenchAngle = tgudData.Angle;
        tgd.WorkoutTarget = 0;
        tgd.Reps = tgudData.Reps;
        context.Datas.InsertOnSubmit(tgd);
    }
    

    【讨论】:

    • @BrokenGlass 谢谢!但现在我收到“无法使用已在使用的密钥添加实体”的错误。有任何想法吗?甚至没有插入一条记录。
    • @abatishchev,我已将 PK 设置为 AutoGenerate = True 和 Auto-Sync = OnInsert,但我仍然收到“无法使用已在使用的密钥添加实体。 “,你有什么想法吗?
    • @Fritos 是否有可能在 FK 字段上存在唯一约束?
    • @msarchet,FK字段上的Primary Key设置为false,Nullable设置为true。
    • @Fritos 仍然可以在此之外设置一个独特的约束。
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2019-09-25
    • 2022-07-06
    相关资源
    最近更新 更多