0

我有 3 张桌子

Brands:
BrandID int
BrandName varchar(30)

Products
ProdID int
ProdName varchar(30)

BrandToProd:
BrandID int => FK Brands.BrandID
ProdID int => FK Products.ProdID

从现有数据库生成模型后,EF 省略 BrandToProd 表并在品牌和产品之间创建多对多关系。我想拥有具有以下字段的第三个实体:

BrandName varchar(30)
ProductsName varchar(30)

这将使我有可能为这个实体使用脚手架。理想情况下,当我添加新的品牌和产品对时,EF 应首先检查数据库中是否已存在此类品牌或产品(以避免重复),如果不存在,则添加到相应的表并添加到 BrandToProd 表的映射。如果 Brand 或 Product 已经存在,EF 应该在添加到 BrandToProd 表时现有 BrandID/ProdID 值。有什么想法吗?

4

3 回答 3

2

您的BrandToProd表是一个纯粹的联结表,即只有两个外键的表。在概念模型中没有类的情况下,将此类表建模为多对多关联是 EF 功能。

将纯连接表作为实体类包含在模型中的最简单方法是

  • 临时向数据库表添加一个虚拟字段
  • 生成模型
  • 从数据库中删除字段
  • 从数据库更新模型
  • 删除 edmx 图中的属性

另一种方法是手动编辑 edmx,但是你真的需要知道你在做什么。如果您不想重新生成模型,您可以生成第二个模型并通过差异查看器调查两个 edmx 文件中的差异。

但是,我想知道您是否需要这样做。您似乎将此与重复检查联系起来。但是,如果您想向数据库添加一个BrandProduct,则必须以任何一种方式检查重复项。如果您想添加新的关联(例如,将现有品牌添加到 Product.Brands),您不必检查它是否存在。如果是这样,EF 将忽略“新”关联。

于 2013-02-08T21:36:32.300 回答
1

作为 Gert 回答的额外点:使用代理键时,总是存在重复管理的问题。通常有 1 个或多个字段构成逻辑键。你可以

  • a) 在 Db 上创建唯一索引。违反约束时 Db 会抱怨
  • b) 在尝试插入之前执行逻辑重复检查。
于 2013-05-10T14:37:41.937 回答
0

我最终只在我的联结表中添加了虚拟 ID 字段,因为我经常更改数据库模式(因为站点开发正在进行中,我需要不时从数据库更新模型)并且不想每个时间删除/添加虚拟字段到数据库。我使用的另一个选项 - 两个表上的 SQL 视图和映射到 EF 中相应操作 (CRUD) 的存储过程

于 2013-05-10T14:26:00.507 回答