我用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')
3条答案
按热度按时间6ie5vjzr1#
正如官方ef6 github所建议的,
在my dbcontext中删除maptostoredprocedure可修复此问题。
我会告诉您尝试删除“maptostoredprocedures()”代码,看看是否得到不同的结果。
mqxuamgl2#
我猜您的实体没有定义主列。这样,实体框架就不能选择表中与实体相关的数据,并更新“everything”(每个条目都匹配主键定义)满足条件的每一行。你需要加上
给你的模特
Cars
你的tableCarId
(不显示此定义)这仅在使用codefirst时有效,如果使用dbfirst,则应检查生成的实体
Cars
如果它的模型正确,如果你在数据库中建模了一个主键。h4cxqtbf3#
savechanges()查找所有数据库集(实体)中的所有更改,并在数据库中提交所有更改,这是一个引入实体框架。