Я пытаюсь создать базу данных 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)
);
Надеюсь, кто-то может показать мне ошибку моих путей.