C# 为什么context.SaveChanges()会更新表中的每一行?

C# 为什么context.SaveChanges()会更新表中的每一行?,c#,mysql,.net,visual-studio,entity-framework-6,C#,Mysql,.net,Visual Studio,Entity Framework 6,我使用C#和实体框架6(EF6)编写了一些代码 使用MySql。 IDE是Visual Studio 2019预览版 我安装了以下软件包: <packages> <package id="EntityFramework" version="6.2.0" targetFramework="net461" /> <package id="MySql.Data" version="6.10.8" targetFramework="net461" /> &

我使用C#和实体框架6(EF6)编写了一些代码 使用MySql。 IDE是Visual Studio 2019预览版

我安装了以下软件包:

<packages>
  <package id="EntityFramework" version="6.2.0" targetFramework="net461" />
  <package id="MySql.Data" version="6.10.8" targetFramework="net461" />
  <package id="MySql.Data.Entity" version="6.10.8" targetFramework="net461" />
</packages>
方法
context.SaveChanges()
总是返回一个精确的数字1, 在控制台窗口上,会打印“numosavedlows:1”

但是,每当我执行该方法时,每一行都会更改

此外,EF6的记录器在控制台上写入如下内容:

Started transaction at 2019-01-03 오후 6:47:59 +09:00
`Car_Update`
-- CarId: '2' (Type = Int32, IsNullable = false)
-- Model: 'new value of the model' (Type = String, IsNullable = false, Size = 5)
-- Year: '2013' (Type = Int32, IsNullable = false)
-- Manufacturer: 'Dodge' (Type = String, IsNullable = false, Size = 5)
-- Executing at 2019-01-03 오후 6:47:59 +09:00
-- Completed in 6 ms with result: 16

Committed transaction at 2019-01-03 오후 6:47:59 +09:00
Disposed transaction at 2019-01-03 오후 6:47:59 +09:00
请查看行
——在6毫秒内完成,结果:16
数字(在本例中为16)是
Car
表中每行的计数

为什么EF6每低一次更新? 我怎样才能修好它

其余代码如下所示:

[DbConfigurationType(typeof(MySqlEFConfiguration))]
class Parking : DbContext
{
    public DbSet<Car> Cars { get; set; }

    public Parking()
      : base()
    {
        // constructor is empty
    }

    // Constructor to use on a DbConnection that is already opened
    public Parking(DbConnection existingConnection, bool contextOwnsConnection)
      : base(existingConnection, contextOwnsConnection)
    {
        // constructor is empty
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Car>().MapToStoredProcedures();
    }
}
大多数代码来自此处:

更新1: 表
Cars
看起来像 (模式和表由EF6自动生成)

更新2: 行的值如下所示: 及
(args是8,'新值')

Context.Savechanges()查找所有数据库集(实体)中的所有更改,并在数据库中提交所有更改,这是一个引入实体框架

我猜您的实体没有定义主列。 这样,Entity Framework就无法选择表中与实体相关的数据,并更新“所有内容”(每个条目都与主键定义匹配)满足条件的每一行。 您需要添加以下内容

[Key, Column("Car_ID_IN_DB"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CarId{ get; set;}
到您的
CarId
上的已建模
Cars
表(您不显示此定义)

这仅在使用CodeFirst时有效,如果使用DbFirst,则应检查生成的
车辆实体是否正确建模,以及是否在数据库中建模了主键。

如中所建议

在my DbContext中删除MapToStoredProcess可修复此问题


我会告诉您尝试删除“MapToStoredProcedures()”代码,看看是否会得到任何不同的结果

您确定更新了16行吗?也许表包含索引,但它是重建的?您是否使用探查器查看生成的sql代码?只有当
CarId
不唯一且有16条记录的
CarId==2
时,才会发生这种情况。您是否检查了DbContext的ChangeTracker中实体的状态?所有这些属性都应等于EntityState。除您更改的实体外,未更改。当您运行数据库跟踪(或使用)以查看发送到数据库的确切命令时,提交的是什么?您可以进入数据库并查找
Car\u Update
过程吗?但是表
Cars
有一个主键
CarId
列是主键。看看这个。不过,他只换了一排。DbContext的ChangeTracker应包含所有元素,但其中大多数元素的状态应等于EntityState.Unchanged。
class Car
{
    public int CarId { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
    public string Manufacturer { get; set; }
}
[Key, Column("Car_ID_IN_DB"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CarId{ get; set;}