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

mi7gmzs6  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(316)

我用c#和实体框架6(ef6)和mysql编写了一些代码。ide是VisualStudio2019预览版。
我安装了以下软件包:

<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>

插入和选择是正确的,但更新有线工程。
我把一些数字(比如2或100)放入 tbx_CarId 我希望ef6只更新一行,但它会更新表中的每一行。

private void btn_update_Click(object sender, EventArgs e)
{
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        connection.Open();

        using (Parking context = new Parking(connection, false))
        {
            context.Database.Log = (string message) => { Console.WriteLine(message); };

            int targetId = Int32.Parse(tbx_CarId.Text);
            var blogs = from b in context.Cars
                        where b.CarId == targetId
                        select b;
            Car item = blogs.Single();
            item.Model = tbx_NewModel.Text;
            int numOfSavedLows = context.SaveChanges();
            Console.WriteLine("numOfSavedLows: " + numOfSavedLows.ToString());
        }
    }
}

方法 context.SaveChanges() 总是返回一个精确的数字1,并且在控制台窗口上打印“numofsavedlows: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

请看这条线 -- Completed in 6 ms with result: 16 数字(在本例中为16)是中每一行的计数 Car table。
为什么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();
    }
}

以及

class Car
{
    public int CarId { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
    public string Manufacturer { get; set; }
}

大多数代码来自这里:https://dev.mysql.com/doc/connectors/en/connector-net-entityframework60.html
更新1:表格 Cars 看起来是这样的(模式和表是由ef6自动生成的)
更新2:行的值如下:before和after(args是8,'new value')

6ie5vjzr

6ie5vjzr1#

正如官方ef6 github所建议的,
在my dbcontext中删除maptostoredprocedure可修复此问题。
我会告诉您尝试删除“maptostoredprocedures()”代码,看看是否得到不同的结果。

mqxuamgl

mqxuamgl2#

我猜您的实体没有定义主列。这样,实体框架就不能选择表中与实体相关的数据,并更新“everything”(每个条目都匹配主键定义)满足条件的每一行。你需要加上

[Key, Column("Car_ID_IN_DB"), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CarId{ get; set;}

给你的模特 Cars 你的table CarId (不显示此定义)
这仅在使用codefirst时有效,如果使用dbfirst,则应检查生成的实体 Cars 如果它的模型正确,如果你在数据库中建模了一个主键。

h4cxqtbf

h4cxqtbf3#

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

相关问题