Этот вопрос состоит из двух частей:
A) Мой дизайн неверен? Если это так, что будет правильным способом сделать это?
B) Если мой дизайн правильный, как мне его реализовать?
У меня есть класс данных, который состоит из нескольких экземпляров класса компонента. Абстракция структуры класса будет такой:
В этом примере у меня есть только два компонента в контейнере, но в действительности у меня есть больше. Также важно отметить, что Container
заботится о том, какой Component
есть какой - они не могут быть просто списком, у них есть отдельные имена и значение для Container
.
Я реализовал следующую структуру в MS SQL Server 2008 для хранения этих данных:
CREATE TABLE Containers (
ID int IDENTITY(1,1) NOT NULL,
ComponentA int NULL,
ComponentB int NULL,
CONSTRAINT PK_Containers PRIMARY KEY (ID));
CREATE TABLE Components (
ID int IDENTITY(1,1) NOT NULL,
Foo nchar(10) NOT NULL,
Bar nchar(10) NOT NULL,
CONSTRAINT PK_Components PRIMARY KEY (ID));
ALTER TABLE Containers
ADD CONSTRAINT FK_ComponentA
FOREIGN KEY (ComponentA)
REFERENCES Components(ID);
ALTER TABLE Containers
ADD CONSTRAINT FK_ComponentB
FOREIGN KEY (ComponentB)
REFERENCES Components(ID);
У этого уже есть несколько недостатков:
В моей модели компоненты уникальны и могут принадлежать только одному свойству в одном контейнере. В БД я должен применять это вручную.
Когда контейнер удаляется, компоненты, на которые он ссылается, также должны быть удалены. Это я должен сделать вручную в БД (с триггером).
Большая проблема, однако, заключается в следующем:
Я использую LINQ-TO-SQL для доступа к базе данных в настольном приложении C # WPF MVVM, которое я создаю в Visual Studio 2010. Когда я перетаскиваю приведенные выше таблицы базы данных в конструктор LINQ-TO-SQL, это то, что я получаю :
Я могу вручную установить отношения «один-к-одному» в конструкторе LING-TO-SQL, чтобы экземпляры Component
не имели наборов типа Container
.
Правильно, каждый Container
имеет две ссылки Component
. Однако экземпляры Component
по-прежнему имеют две ссылки Container
, где моя модель требует, чтобы они имели только одну.
Как реализовать дизайн моего класса в SQL Server или , как убедить LINQ-to-SQL интерпретировать мою базу данных так, как я планировал?