SQL Server,LINQ到SQL,表示容器类中的多个组件

SQL Server,LINQ到SQL,表示容器类中的多个组件,sql,sql-server,database,linq-to-sql,database-design,Sql,Sql Server,Database,Linq To Sql,Database Design,这个问题分为两部分: A)我的设计错了吗?如果是这样,正确的方法是什么 B)如果我的设计是正确的,我如何实现它 我有一个数据类,它由一个组件类的多个实例组成。类结构的抽象如下: 在本例中,容器中只有两个组件,但实际上我有更多。同样重要的是要指出,容器关心的是哪个组件是哪个-它们不仅仅是一个列表,它们对容器有各自的名称和意义 我在MS SQL Server 2008中实现了以下结构来存储此数据: CREATE TABLE Containers ( ID int IDENTITY(1,1) N

这个问题分为两部分:

A)我的设计错了吗?如果是这样,正确的方法是什么

B)如果我的设计是正确的,我如何实现它

我有一个数据类,它由一个组件类的多个实例组成。类结构的抽象如下:

在本例中,容器中只有两个组件,但实际上我有更多。同样重要的是要指出,
容器
关心的是哪个
组件
是哪个-它们不仅仅是一个列表,它们对
容器
有各自的名称和意义

我在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);   
这已经有一些缺点:

  • 在我的模型中,组件是唯一的,并且只能属于一个容器上的一个属性。在DB中,我必须手动执行此操作

  • 删除容器时,它引用的组件也应删除。我必须在DB中手动执行此操作(使用触发器)

然而,最大的问题是:

我在VisualStudio2010中构建的C#WPF MVVM桌面应用程序中使用LINQ-TO-SQL进行数据库访问。当我将上面的数据库表拉入LINQ-TO-SQL设计器时,我得到的是:

我可以在LING-to-SQL设计器中手动将关系设置为一对一,以阻止
组件
实例拥有
容器
类型集。 正确地说,每个
容器
都有两个
组件
引用但是,
组件
实例仍然有两个
容器
引用,而我的模型要求它们只有一个引用。


如何在SQL Server中实现我的类设计如何说服LINQ to SQL按照我预期的方式解释我的数据库?

容器有许多组件,但需要按名称引用它们。您需要从容器到组件的关系表(在伪sql中):

要回答这个问题:

在我的模型中,组件是唯一的,并且只能属于一个容器上的一个属性。在DB中,我必须手动执行此操作

只需在
ContainerComponents
中为
ContainerID
ComponentID
创建一个唯一的约束即可

还有这个:

删除容器时,它引用的组件也应删除。我必须在DB中手动执行此操作(使用触发器)


使用从
Container
ContainerComponents
Component

如何将从
ContainerComponents
Component
的删除级联到
Component
,因为
Component
是该外键关系中的父表?@Harikawashi:是的,我认为你做不到。也许你可以用一个扳机。
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)
)