SQL Server, LINQ-to-SQL и представление нескольких компонентов в классе контейнера - PullRequest
3 голосов
/ 08 июля 2011

Этот вопрос состоит из двух частей:

A) Мой дизайн неверен? Если это так, что будет правильным способом сделать это?

B) Если мой дизайн правильный, как мне его реализовать?

У меня есть класс данных, который состоит из нескольких экземпляров класса компонента. Абстракция структуры класса будет такой: Class Diagram

В этом примере у меня есть только два компонента в контейнере, но в действительности у меня есть больше. Также важно отметить, что 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, это то, что я получаю :

LINQ-TO-SQL Diagram

Я могу вручную установить отношения «один-к-одному» в конструкторе LING-TO-SQL, чтобы экземпляры Component не имели наборов типа Container. Правильно, каждый Container имеет две ссылки Component. Однако экземпляры Component по-прежнему имеют две ссылки Container, где моя модель требует, чтобы они имели только одну.

Как реализовать дизайн моего класса в SQL Server или , как убедить LINQ-to-SQL интерпретировать мою базу данных так, как я планировал?

1 Ответ

1 голос
/ 08 июля 2011

Контейнер имеет много компонентов, но должен ссылаться на них по имени. Вам нужна таблица отношений от контейнера к компоненту (в псевдо-sql):

create table ContainerComponents (
  ContainerID int FK references Container(ID),
  ComponentID int FK references Component(ID),
  Name string,
  -- optional - to give the relationship a meaning
  Type int FK references RelationshipType(ID)
)

Чтобы ответить на этот вопрос:

В моей модели компоненты уникальны и могут принадлежать только одному свойству в одном контейнере. В БД я должен применять это вручную.

Просто создайте уникальное ограничение в ContainerComponents для ContainerID и ComponentID.

А вот этот:

Когда контейнер удаляется, компоненты, на которые он ссылается, также должны быть удалены. Это я должен сделать вручную в БД (с триггером).

Использование каскадного удаления от Container до ContainerComponents до Component.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...