【问题标题】:More than one record is updated EF-Linq C#更新了不止一条记录 EF-Linq C#
【发布时间】:2019-02-18 23:59:47
【问题描述】:

我有下表:

我有几个数组,如果数据匹配,我将在其中滚动以减少其数量:

//DISMINUYE CANTIDAD DE CASILLER
        public void disminuyeCasiller(string[] codParte, string [] rolls, double[] cantResta)
        {
            int size = codParte.Length;

            for(int i = 0; i < size; i++)
            {
                string parte = codParte[i];
                string rol = rolls[i];
                double valorRes = cantResta[i];

                using(var ctx=new ModelContext())
                {
                    Casiller updateRollo = ctx.Casillers.Where(x => x.cod_parte == parte && x.rollo == rol).First();
                    double newValue = updateRollo.cantidad - valorRes;
                    updateRollo.cantidad = newValue;
                    ctx.SaveChanges();
                }
            }
        }

根据这段代码的作用,首先要知道排列的大小(所有数组都将具有相同的大小),创建一个for 并获取rollocod_parte 的数量匹配,在这种情况下300 将减去到达cantResta 的金额,例如100.50,一旦在原来的位置分配减法,保存更改并在必要时重复,直到一切都完成很好。

我正在传递这些数据:

codparte[]=new array{"11155"};
rollos[]=new array{"RT0102"};
cantRest[]=new array{100.50};

//Size and data can be different -only a example 

cantidad 的末尾和rollo RT0102 在表中我应该保持这样:199.50,问题是更新两条记录,它看起来像这样:

为什么在未选择此行时还要更新RT0103?我在句子中做错了什么? (将来可能会成为问题,因为许多rollos具有相同的信息)

屏幕截图断点

【问题讨论】:

  • "我正在传递这些数据..." 你确定吗?参数的数据类型与参数的数据类型不匹配,为数组。
  • @JohnWu 我假设数据在每个数组中传递,我将编辑问题
  • 您是否定义了主键,并在 EF 中将其标记为这样?
  • @JohnWu 只有cod_parte 是主键

标签: c# entity-framework linq


【解决方案1】:

只有 cod_parte 是主键

这就是问题所在。

主键必须是唯一的,但在您的情况下,您有多个具有相同 cod_parte 的记录。所以它甚至不是一个键,更不用说主键了。

当您调用SaveChanges() 时,EF 将生成一条带有 WHERE 子句的 SQL 语句,其中包含主键,没有其他内容,假设主键将准确标识一条记录。这个假设是错误的,因为你的“主键”并不是真正的键。

对于此表,您需要一个至少为 cod_parterollo 的复合主键,或者,正如 Robert 所指出的,一个真正的合成主键。

另见How to specify a compound key in EF

【讨论】:

  • [Key][Column(Order = 0)]public string cod_parte { get; set; }[Key] [Column(Order = 1)]public string rollo { get; set; } 工作,谢谢
【解决方案2】:

请检查您的通过数据,如果仅通过codParte=111555,rolls=RT0102,cantRest=100.50,则不会更新RT0103

例如:

public class Test{
    public static void Main(){
        disminuyeCasiller(new[] { "111555"}, new[] { "RT0102"}, new[] {100.50});
    }

    public static void disminuyeCasiller(string[] codParte, string[] rolls, double[] cantResta)
    {
        int size = codParte.Length;

        for (int i = 0; i < size; i++)
        {
            string parte = codParte[i];
            string rol = rolls[i];
            double valorRes = cantResta[i];
            Console.WriteLine($"parte {parte}/rol {rol}/valorRes {valorRes}"); //Result:parte 111555/rol RT0102/valorRes 100.5
        }
    }
}

【讨论】:

  • 这就是问题所在,我从来没有通过RT0103,但它会更新该记录
  • 你为什么确定? chrome web工具检查传递数据?调试检查?
  • 我上传了断点截图,如果Casiller updateRollo =...这一行有影响代码的地方,请确认
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多