实体框架查找表

时间:2013-02-08 11:25:52

标签: asp.net-mvc-4 entity-framework-5

我有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表。如果已存在品牌或产品,则在添加到BrandToProd表时,EF应该是否存在BrandID / ProdID值。有什么想法怎么做?

3 个答案:

答案 0 :(得分:2)

您的BrandToProd表是纯联结表,即只有两个外键的表。这是一个EF功能,可以将这些表建模为多个关联,而不需要概念模型中的类。

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

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

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

然而,我想知道你是否需要这样做。您似乎将此与重复检查相关联。但是,如果要向数据库添加BrandProduct,则必须以任一方式检查重复项。如果要添加新关联(例如,将现有品牌添加到Product.Brands),则无需检查其是否存在。如果是这样,EF就会忽略“新”关联。

答案 1 :(得分:1)

作为格特回答的额外观点: 使用代理键时,始终存在重复管理的问题。通常,有一个或多个字段构成逻辑密钥。 你可以

  • a)在Db上创建一个唯一索引。当违反约束时,Db会抱怨
  • b)在尝试插入之前执行逻辑重复检查。

答案 2 :(得分:0)

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