实体框架添加数据不应该通过其他对象

时间:2014-06-08 09:28:21

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

我认为这个问题已经被提出,我似乎无法找到我理解的答案。 我有一个与实体框架一起工作的程序 - 代码优先。

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

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

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

数据绑定代码

            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

1 个答案:

答案 0 :(得分:0)

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

在我创建新客户并通过该类别的部分中,它应具有

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从数据库中提取正确的类别,并将其链接到创建的新客户。 (至少这是我理解的方式)

这个链接是我正在创建这个项目的主要内容,这是我在代码第一个EF上发现的少数实际VB示例之一。 http://visualstudiomagazine.com/articles/2012/03/07/an-ef-code-first-tutorial.aspx

如果有人想对我的工作方式或编码方式加以批评,请做! 我总是乐于提高自己的技能:)