gpt4 book ai didi

SQL Server、LINQ-to-SQL 和表示容器类中的多个组件

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:53 25 4
gpt4 key购买 nike

这个问题分为两部分:

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 被删除时,它引用的 Components 也应该被删除。我必须在数据库中手动执行此操作(使用触发器)。

然而,最大的问题是:

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

LINQ-TO-SQL Diagram

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

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

最佳答案

容器有很多组件,但需要通过名称来引用它们。您需要一个从容器到组件的关系表(在伪 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)
)

回答这个问题:

In my model, components are unique, and can only belong to one property on one Container. In the DB, I have to enforce this manually.

只需在 ContainerComponents 中为 ContainerIDComponentID 创建一个唯一约束。

还有这个:

When a Container is deleted, the Components it references should also be deleted. This I have to do manually in the DB (with a trigger).

使用从 ContainerContainerComponentsComponent 的级联删除。

关于SQL Server、LINQ-to-SQL 和表示容器类中的多个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com