#c# #sql-server #razor #asp.net-mvc-5
#c# #sql-сервер #razor #asp.net-mvc-5
Вопрос:
У меня следующий сценарий:
У меня есть Contact
со свойствами FirstName
и LastName
. Контакт может иметь несколько PhoneNumbers
и столько EmailAddresses
, сколько нужно. Я определил их как 3 объекта с общими отношениями. Пожалуйста, ознакомьтесь с определениями таблиц ниже:
create table Contact
(
ID int primary key not null identity(1,1),
FirstName nvarchar(40),
LastName nvarchar(40)
);
go
create table ContactNumber
(
ID int primary key not null identity(1,1),
PhoneNumber nvarchar(40)
);
go
create table EmailAddress
(
ID int primary key not null identity(1,1),
EmailAddress nvarchar(40)
);
go
create table UserContact
(
ID int primary key not null identity(1,1),
ContactID int foreign key references Contact(ID),
ContactNumberID int foreign key references ContactNumber(ID),
EmailID int foreign key references EmailAddress(ID)
);
go
Теперь мне нужно отобразить этих пользователей в веб-приложении по моему выбору. Я выбрал C # MVC с движком Razor для представления. Я пытаюсь смоделировать это представление в таблице. Для редактирования, удаления, создания нового контакта и просмотра сведений о контакте в таблице требуются ссылки на действия. Я хочу, чтобы результирующий набор отображался следующим образом:
FirstName | LastName | ContactNumber | EmailAddress
-------------------------------------------------------
James | Smith | 082 111 5454 | james@domain1.com | edit | details | delete
| james@domain2.com
| james@domain3.com
--------------------------------------------------------
Luther | Arnolds | 082 111 5455 | luther@domain1.com | edit | details | delete
| 082 111 5456 |
--------------------------------------------------------
Sarah | Jones | 082 111 5510 | sarah@domain.com | edit | details | delete
---------------------------------------------------------
| | |
Однако я просто не нахожу способ записи для перевода ContactNumberID
и EmailID
столбцов из UserContact
в map из их соответствующих связующих таблиц. Проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, что она дублирует записи в UserContact
, таким образом, таблица содержит много избыточных данных. Например, запись для James Smith
будет повторяться 3 раза. Как я могу добиться этого в ASP.Net MVC без какого-либо дублирования записей?
Комментарии:
1. Может ли один адрес электронной почты или номер телефона использоваться более чем 1 контактом? Я подозреваю, что нет. Я бы поместил ContactID в качестве внешнего ключа в таблицах EmailAddress и PhoneNumber и удалил таблицу UserContact. Здесь у вас не так много для многих. У вас есть два разных отношения «1 ко многим».
2. @SeanLange Хорошо, тогда как я буду сопоставлять отношения с
Contact
? Потому что мне отказывают в добавлении составного первичного ключа, ссылающегося наContactID
наEmailAddress
иContactNumber
таблицы.
Ответ №1:
Я бы сделал что-то вроде этого. Обратите внимание, что я немного изменил названия столбцов. Мне очень неприятно иметь столбец с именем ID. Это идентификатор контакта (или что-то еще), независимо от того, в какой таблице он находится. Мне также очень не нравятся имена столбцов, изменяющиеся для одного и того же фрагмента данных в связанных таблицах.
create table Contact
(
ContactID int primary key not null identity(1,1),
FirstName nvarchar(40) not null,
LastName nvarchar(40) not null
);
go
create table ContactNumber
(
ContactNumberID int primary key not null identity(1,1),
PhoneNumber nvarchar(40) not null,
ContactID int not null,
constraint FK_ContactNumber_Contact_ContactID Foreign Key (ContactID) references Contact(ContactID)
);
go
create table EmailAddress
(
EmailAddressID int primary key not null identity(1,1),
EmailAddress nvarchar(40) not null,
ContactID int not null,
constraint FK_EmailAddress_Contact_ContactID Foreign Key (ContactID) references Contact(ContactID)
);
go