繁体   English   中英

如何使用实体框架更新数据库中的数量

[英]How to update quantity in database using Entity Framework

我想写一个 function 来更新数据库中的数量。 在我的代码中,它会引发错误“stokModel 为空”。 为什么? 我无法在我的 datagridview 行中达到 id 并且 stok model 返回 null。 我的问题是如何获得 xstSabits 中每条记录的 id 并使用此 id 更新数量。

这是我的代码;

private void StokMiktariGuncelle()
{
    for (int i = 0; i < dgvSepet.Rows.Count; i++)
    {
        using (fastCellDbEntities db = new fastCellDbEntities())
        {
            var stokModel = db.xstSabits.Find(Convert.ToInt32(dgvSepet.Rows[i].Cells["Id"].Value));

            stokModel.azamiStok -= stokModel.azamiStok - Convert.ToDecimal(dgvSepet.Rows[i].Cells["Quantity"].Value);

            db.Entry(stokModel).Property(x => x.azamiStok).CurrentValue = stokModel.azamiStok;
            db.SaveChanges();
        }
    }
}

在 DataGriView 中管理您的 Id 似乎有点棘手。 当您想要手动设置列时,您可能需要考虑设置每列的DataPropertyName属性。 完成此操作后,您可以将 DatabaseModels 直接绑定到 Grids DataSource。

这将使从选定行中读取 Id 变得容易。

这是一个简单的例子:

    CREATE TABLE exampleEntity
    (
        [Id] int not null PRIMARY KEY IDENTITY(1,1),
        [SomeValue] int not null,
        [SomeString] varchar(max) null
    );

    INSERT INTO exampleEntity ([SomeValue], [SomeString])
    VALUES
    (42, 'String21ß'),
    (35, 'asdadkpq3eß0i'),
    (37, ''),
    (24, null),
    (17, 'laksjdadjqpwdp')
    ;

在这个简单的数据库中,我从数据库 EF model 构建了一个代码优先的脚手架。

然后只需设置您的 DataGridView (将DataPropertyName添加到每一列)

    public Form1()
    {
        InitializeComponent();

        this.dt.AutoGenerateColumns = false;
        this.dt.MultiSelect = false;
        this.dt.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

        //Id column
        this.dt.Columns.Add(new DataGridViewTextBoxColumn()
        {
            DataPropertyName = "Id", //Name of database column
            Name = "Id", //Display name of datagrid column
            Visible = false
        });

        //SomeValue Column
        this.dt.Columns.Add(new DataGridViewTextBoxColumn()
        {
            DataPropertyName = "SomeValue",
            Name = "Value"
        });

        //SomeString Column
        this.dt.Columns.Add(new DataGridViewTextBoxColumn()
        {
            DataPropertyName = "SomeString",
            Name = "String"
        });
    }

然后加载您的数据,您现在可以使用 DataBinding:

    private void Form1_Load(object sender, EventArgs e) => this.dt.DataSource = new ExampleModel().exampleEntities.ToList();

现在从选定的项目中读取 Id 非常容易:

    private void Button1_Click(object sender, EventArgs e)
    {
        //Read id from selected item
        int idSelectedItem = (this.dt.SelectedRows[0].DataBoundItem as exampleEntity).Id;

        using (ExampleModel ctxt = new ExampleModel())
        {
            exampleEntity entity = ctxt.exampleEntities.Find(idSelectedItem);

            entity.SomeValue += 42;

            ctxt.SaveChanges();
        }
    }

重要说明如果您重用最初用于填充 DataGridView 的相同上下文,则可以避免在读取所选项目时打开另一个上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM