这个问题是代表多个组件:SQL Server中,LINQ到SQL和两个部分的容器类
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);
这已经有一些缺点:
在我的模型,组件是独一无二的,并且只能属于一个Container上的一个属性。在数据库中,我必须手动执行此操作。
当容器被删除时,它所引用的组件也应该被删除。这我必须在数据库中手动执行(带触发器)。
最大的问题,然而,就是这样:
我使用LINQ到SQL在C#WPF MVVM桌面应用程序我建立在Visual Studio 2010中我的数据库访问当我拉数据库表以上入LINQ到SQL设计师,这是我所得到的:
我可以手动设置为一到一个在LING-TO-SQL设计师的关系,停止Component
实例来自Container
类型的集合。 正确地说,每个Container
有两个Component
引用。 但是,Component
实例仍然有两个Container
引用,其中我的模型要求它们只有一个。
我如何能实现在SQL Server我一流的设计或我怎么能说服LINQ到SQL来解释我的数据库我希望的方式?
由于Component是该外键关系中的父表,因此如何将ContainerComponents中的删除级联到Component? –
@Harikawashi:是的你说得对,我认为你不能这样做。也许你可以在这种情况下使用触发器。 –