2011-07-08 37 views
3

这个问题是代表多个组件:SQL Server中,LINQ到SQL和两个部分的容器类

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); 

这已经有一些缺点:

  • 在我的模型,组件是独一无二的,并且只能属于一个Container上的一个属性。在数据库中,我必须手动执行此操作。

  • 当容器被删除时,它所引用的组件也应该被删除。这我必须在数据库中手动执行(带触发器)。

最大的问题,然而,就是这样:

我使用LINQ到SQL在C#WPF MVVM桌面应用程序我建立在Visual Studio 2010中我的数据库访问当我拉数据库表以上入LINQ到SQL设计师,这是我所得到的:

LINQ-TO-SQL Diagram

我可以手动设置为一到一个在LING-TO-SQL设计师的关系,停止Component实例来自Container类型的集合。 正确地说,每个Container有两个Component引用。 但是,Component实例仍然有两个Container引用,其中我的模型要求它们只有一个。

我如何能实现在SQL Server我一流的设计我怎么能说服LINQ到SQL来解释我的数据库我希望的方式?

回答

1

容器有许多组件,但需要按名称引用它们。你需要一个关系表,从容器组件(伪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唯一约束为ContainerIDComponentID

这一个:

当容器被删除,它引用的组件也应予以删除。这我必须在数据库中手动执行(带触发器)。

使用级联删除从ContainerContainerComponentsComponent

+0

由于Component是该外键关系中的父表,因此如何将ContainerComponents中的删除级联到Component? –

+0

@Harikawashi:是的你说得对,我认为你不能这样做。也许你可以在这种情况下使用触发器。 –