VB. NET не может связать данные между двумя первыми таблицами кода EF - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь создать базу данных Bookings / Accounts, используя сначала код EF, и у меня возникают проблемы со связыванием данных

Немного фона

База данных имеет , в данный момент 6 таблиц объединены в этом контексте, но в данный момент я просто пытаюсь отсортировать ассоциации для следующих

Public Class CompanyContext
    Inherits DbContext
    Public Property Drivers As DbSet(Of Driver)
    Public Property Addresses As DbSet(Of Address)
    Public Property Contacts As DbSet(Of ContactDetail)
    Public Property Bookings As DbSet(Of Booking)
    Public Property Accounts As DbSet(Of Account)
    Public Property Vehicles As DbSet(Of Vehicle)
End Class

Позже будет больше ссылок на данные, но мой исходный Проблема заключается в следующем. Я могу создать учетную запись со следующими свойствами.

Public Class Account
    Public Property Id As Integer
    Public Property Shortcut As String = ""
    Public Property PaymentMethod As PaymentType
    Public Property CardNumber As Integer
    Public Property CardExpiry As New Date(2000, 1, 1)
    Public Property CardSecurity As Integer
    Public Property AccountAddress As Address
    Public Property Contact As ContactDetail
    Public Property Active As Boolean = True
End Class

Public Class ContactDetail
    Public Property Id As Integer
    Public Property Telephone1 As String = ""
    Public Property Telephone2 As String = ""
    Public Property Email1 As String = ""
    Public Property Email2 As String = ""
    Public Property Fax As String = ""

End Class

Public Class Address
    Public Property AddressId As Integer
    Public Property Company As String = ""
    Public Property FlatBuilding As String = ""
    Public Property Road As String = ""
    Public Property Town As String = ""
    Public Property County As String = ""
    Public Property Country As String = ""
    Public Property PostCode As String = ""
End Class

Я создаю каждую учетную запись, используя данные из TextBoxes, ComboBoxes et c. Когда дело доходит до сохранения данных, все сохраняется в соответствующей таблице. В таблице Accounts хранится идентификатор соответствующих строк в таблицах Addresses и Contacts, а данные Address и Contact из Account хранятся там правильно.

Проблема

Когда дело доходит до извлечения данных для определенного c Account, данные Contact или Address не возвращаются. Все, что я получаю, это свойства со значениями по умолчанию. Я пытался следовать инструкциям на сайте MS, но ВСЕГДА получаю сообщение об ошибке, в зависимости от того, каким образом я пытаюсь создать навигацию. Боюсь, я не до конца понимаю, что требуется. Все учебники находятся в C#, но я уверен, что получаю jist.

В конечном итоге я хочу, чтобы адрес и контактные данные были своего рода общим пулом , который можно связать с из других таблиц. Но это может стать другим вопросом, когда я узнаю, где я иду не так прямо сейчас. Это методы, которые я использую для сохранения и извлечения данных.

selectedAccount является экземпляром Account класса

Private Sub AccountSave()
        Using db As New CompanyContext
            If newAccount = True Then
                selectedAccount = New Account
            End If
            With selectedAccount
                .AccountAddress.Company = TxtAccountCompany.Text
                .Shortcut = TxtAccountShortcut.Text
                Select Case CboAccountPaymentMethod.SelectedItem.ToString
                    Case "Account"
                        .PaymentMethod = PaymentType.Account
                    Case "Cash"
                        .PaymentMethod = PaymentType.CashTopay
                    Case "Card"
                        .PaymentMethod = PaymentType.CCToPay
                End Select
                .CardNumber = Integer.Parse(TxtAccountCardNumber.Text)
                .CardExpiry = Date.Parse(MtbAccountCardExpiry.Text)
                .CardSecurity = Integer.Parse(TxtAccountCardSecurity.Text)
                .AccountAddress.FlatBuilding = TxtAccountFlatBuilding.Text
                .AccountAddress.Road = TxtAccountRoad.Text
                .AccountAddress.Town = TxtAccountTown.Text
                .AccountAddress.County = TxtAccountCounty.Text
                .AccountAddress.PostCode = TxtAccountPostcode.Text
                .AccountAddress.Country = TxtAddressCountry.Text
                .Contact.Telephone1 = TxtAccountTelephone1.Text
                .Contact.Telephone2 = TxtAccountTelephone2.Text
                .Contact.Email1 = TxtAccountEmail1.Text
                .Contact.Email2 = TxtAccountEmail2.Text
            End With
            If selectedAccount.Id = 0 Then
                db.Accounts.Add(selectedAccount)
            End If
            db.SaveChanges()
        End Using
        AccountClearInfo()
        AccountDisableEditing()
        AccountRefreshList()
    End Sub
   Private Sub AccountDisplayInfo()
        If selectedAccount IsNot Nothing Then
            TxtAccountCompany.Text = selectedAccount.AccountAddress.Company
            TxtAccountShortcut.Text = selectedAccount.Shortcut
            TxtAccountOustandingBalance.Text = selectedAccount.OustandingBalance.ToString
            Select Case selectedAccount.PaymentMethod
                Case PaymentType.Account
                    CboAccountPaymentMethod.SelectedText = "Account"
                Case PaymentType.CCToPay
                    CboAccountPaymentMethod.SelectedText = "Card"
                Case PaymentType.CashTopay
                    CboAccountPaymentMethod.SelectedText = "Cash"
            End Select
            TxtAccountCardNumber.Text = selectedAccount.CardNumber.ToString
            MtbAccountCardExpiry.Text = selectedAccount.CardExpiry.ToShortDateString
            TxtAccountCardSecurity.Text = selectedAccount.CardSecurity.ToString
            TxtAccountFlatBuilding.Text = selectedAccount.AccountAddress.FlatBuilding.ToString
            TxtAccountRoad.Text = selectedAccount.AccountAddress.Road.ToString
            TxtAccountTown.Text = selectedAccount.AccountAddress.Town.ToString
            TxtAccountCounty.Text = selectedAccount.AccountAddress.County.ToString
            TxtAccountPostcode.Text = selectedAccount.AccountAddress.PostCode.ToString
            TxtAccountCountry.Text = selectedAccount.AccountAddress.Country.ToString
            TxtAccountTelephone1.Text = selectedAccount.Contact.Telephone1
            TxtAccountTelephone2.Text = selectedAccount.Contact.Telephone2
            TxtAccountEmail1.Text = selectedAccount.Contact.Email1
            TxtAccountEmail2.Text = selectedAccount.Contact.Email2
        End If
    End Sub


Если это полезно здесь это код, который был создан за кулисами для создания каждой таблицы

CREATE TABLE [dbo].[Accounts] (
    [Id]                       INT            IDENTITY (1, 1) NOT NULL,
    [Shortcut]                 NVARCHAR (MAX) NULL,
    [PaymentMethod]            INT            NOT NULL,
    [CardNumber]               INT            NOT NULL,
    [CardExpiry]               DATETIME       NOT NULL,
    [CardSecurity]             INT            NOT NULL,
    [Active]                   BIT            NOT NULL,
    [AccountAddress_AddressId] INT            NULL,
    [Contact_Id]               INT            NULL,
    CONSTRAINT [PK_dbo.Accounts] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.Accounts_dbo.Addresses_AccountAddress_AddressId] FOREIGN KEY ([AccountAddress_AddressId]) REFERENCES [dbo].[Addresses] ([AddressId]),
    CONSTRAINT [FK_dbo.Accounts_dbo.ContactDetails_Contact_Id] FOREIGN KEY ([Contact_Id]) REFERENCES [dbo].[ContactDetails] ([Id])
);


GO
CREATE NONCLUSTERED INDEX [IX_AccountAddress_AddressId]
    ON [dbo].[Accounts]([AccountAddress_AddressId] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_Contact_Id]
    ON [dbo].[Accounts]([Contact_Id] ASC);
CREATE TABLE [dbo].[Addresses] (
    [AddressId]    INT            IDENTITY (1, 1) NOT NULL,
    [Company]      NVARCHAR (MAX) NULL,
    [FlatBuilding] NVARCHAR (MAX) NULL,
    [Road]         NVARCHAR (MAX) NULL,
    [Town]         NVARCHAR (MAX) NULL,
    [County]       NVARCHAR (MAX) NULL,
    [Country]      NVARCHAR (MAX) NULL,
    [PostCode]     NVARCHAR (MAX) NULL,
    [Booking_Id]   INT            NULL,
    [Booking_Id1]  INT            NULL,
    CONSTRAINT [PK_dbo.Addresses] PRIMARY KEY CLUSTERED ([AddressId] ASC),
    CONSTRAINT [FK_dbo.Addresses_dbo.Bookings_Booking_Id] FOREIGN KEY ([Booking_Id]) REFERENCES [dbo].[Bookings] ([Id]),
    CONSTRAINT [FK_dbo.Addresses_dbo.Bookings_Booking_Id1] FOREIGN KEY ([Booking_Id1]) REFERENCES [dbo].[Bookings] ([Id])
);


GO
CREATE NONCLUSTERED INDEX [IX_Booking_Id]
    ON [dbo].[Addresses]([Booking_Id] ASC);


GO
CREATE NONCLUSTERED INDEX [IX_Booking_Id1]
    ON [dbo].[Addresses]([Booking_Id1] ASC);
CREATE TABLE [dbo].[ContactDetails] (
    [Id]         INT            IDENTITY (1, 1) NOT NULL,
    [Telephone1] NVARCHAR (MAX) NULL,
    [Telephone2] NVARCHAR (MAX) NULL,
    [Email1]     NVARCHAR (MAX) NULL,
    [Email2]     NVARCHAR (MAX) NULL,
    [Fax]        NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.ContactDetails] PRIMARY KEY CLUSTERED ([Id] ASC)
);

Надеюсь, кто-то может показать мне ошибку моих путей.

...