mysql - Entity Framework 添加不应通过其他对象添加的数据

标签 mysql vb.net entity-framework database-design

我认为这个问题已经被问过,我只是似乎找不到我理解的答案。 我有一个与 Entity Framework 配合使用的程序 - 代码优先。

当程序运行并且数据库尚未创建时,它将创建数据库并向其中添加一些数据。 它添加的数据有3个类别,每个客户在创建客户对象时都会分配一个类别。 这 3 个类别也数据绑定(bind)到组合框,创建客户时,从组合框中选择类别

问题:当创建客户时,似乎也创建了类别的副本,类别副本被添加到类别表中(不应该发生在我的脑海中),当然这个副本也是添加到组合框。

我无法理解为什么会发生这种情况以及我做错了什么。 我也不确定应该在此处发布代码的哪些部分或应该在哪里查找错误,尽管我感觉这种情况是由糟糕的数据库设计/类设计造成的。 这是我第一次使用 Entity Framework

数据绑定(bind)代码

            Dim DisplayLimos As New BindingSource
            context.LimosDb.Load()
            DisplayLimos.DataSource = context.LimosDb.Local.ToBindingList()
            CbLimos.DataSource = DisplayLimos
            CbLimos.DisplayMember = "Info"
            Dim DisplayCategories As New BindingSource
            context.CategoriesDb.Load()
            DisplayCategories.DataSource = context.CategoriesDb.Local.ToBindingList()
            CbCategorie.DataSource = DisplayCategories
            CbCategorie.DisplayMember = "Naam"
            Dim DisplayKlanten As New BindingSource
            context.KlantenDb.Load()
            DisplayKlanten.DataSource = context.KlantenDb.Local.ToBindingList()
            ListBoxKlanten.DataSource = DisplayKlanten
            ListBoxKlanten.DisplayMember = "Naam"
            Dim displayArrangementen As New BindingSource
            context.ArrangementenDb.Load()
            displayArrangementen.DataSource = context.ArrangementenDb.Local.ToBindingList()
            CbArrangementen.DataSource = displayArrangementen
            CbArrangementen.DisplayMember = "Naam"

用于填充类别表的代码第二个参数是一个包含每个类别折扣的类

        Dim categorieVip As New KlantenCategorie("Vip", kortingVip)
        Dim categorieWedding As New KlantenCategorie("Wedding", kortingWeddingPlanner)
        Dim categorieNightLife As New KlantenCategorie("NightLife", kortingConcertenPlanner)
        context.CategoriesDb.Add(categorieVip)
        context.CategoriesDb.Add(categorieWedding)
        context.CategoriesDb.Add(categorieNightLife)
        context.SaveChanges()

将客户添加到数据库的代码以及在发生错误时还创建了类别副本的代码

Private Sub BtnKlant_Click(sender As Object, e As EventArgs) Handles BtnKlant.Click
    Dim adres As New Adres(TxbStraat.Text, TxbHuisN.Text, CType(TxbPostCode.Text, Integer), TxbGemeente.Text)
    Dim klant As New Klant(CType(TxbKlantNr.Text, Integer), TxbVoorNaam.Text, TxbNaam.Text, adres, CType(TxbBtwNr.Text, Integer), CType(CbCategorie.SelectedValue, KlantenCategorie))
    Try
        _Context.KlantenDb.Add(klant)
        _Context.SaveChanges()
        ListBoxKlanten.Refresh()
        MessageBox.Show("Klant succesvol toegevoegt")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try


End Sub

最佳答案

我相信我已经找到了我的错误所在。

在我创建新客户并传递其应有的类别的部分

Private Sub BtnKlant_Click(sender As Object, e As EventArgs) Handles BtnKlant.Click
    Dim adres As New Adres(TxbStraat.Text, TxbHuisN.Text, CType(TxbPostCode.Text, Integer), TxbGemeente.Text)
    Dim klant As New Klant(CType(TxbKlantNr.Text, Integer), TxbVoorNaam.Text, TxbNaam.Text, adres, CType(TxbBtwNr.Text, Integer), CType(CbCategorie.SelectedValue, KlantenCategorie))
    Try
        _Context.KlantenDb.Add(klant)
        _Context.SaveChanges()
        ListBoxKlanten.Refresh()
        MessageBox.Show("Klant succesvol toegevoegt")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try


End Sub

我改变了这个

Dim klant As New Klant(CType(TxbKlantNr.Text, Integer), TxbVoorNaam.Text, TxbNaam.Text, adres, CType(TxbBtwNr.Text, Integer), CType(CbCategorie.SelectedValue, KlantenCategorie))

到此

 Dim klant As New Klant(CType(TxbKlantNr.Text, Integer), TxbVoorNaam.Text, TxbNaam.Text, adres, CType(TxbBtwNr.Text, Integer), _Context.CategoriesDb.First(Function(ct) ct.Naam = CbCategorie.Text))

使用 lambda 从数据库中提取正确的类别并将其链接到创建的新客户。 (至少我是这么理解的)

此链接是我创建此项目的主要内容,是我在 Code First EF 上找到的少数几个带有实际 VB 示例的链接之一。 http://visualstudiomagazine.com/articles/2012/03/07/an-ef-code-first-tutorial.aspx

如果有人想对我的工作或编码方式提出批评,请这样做! 我始终愿意提高我的菜鸟技能:)

关于mysql - Entity Framework 添加不应通过其他对象添加的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24104765/

相关文章:

MySQL 为特定查询指定innodb_lock_wait_timeout

MySQL 连接池与 Node.js

php - 员工月休假报表

linq - Entity Framework 中的复杂连接

entity-framework - 如何修复 EntityFrameworkCore 中的数据迁移错误?

php - 想做产品过滤器,但我得到错误

vb.net - VB .net - 查找字符串中第 N 次出现的字符的最短且最快的方法?

c# - VB.Net "IsDBNull"的 C# 等效项是什么

vb.net - 如何在 Visual Basic 中声明和访问数组?

entity-framework - 如何编辑以前应用的迁移而不先在 EF 代码中添加另一个迁移