Asp.net mvc 4 实体框架查找表
我有三张桌子Asp.net mvc 4 实体框架查找表,asp.net-mvc-4,entity-framework-5,Asp.net Mvc 4,Entity Framework 5,我有三张桌子 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
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表的映射。如果品牌或产品已经存在,EF应在添加到BrandToProd表时显示现有BrandID/ProdID值。你知道怎么做吗?你的
BrandToProd
表是一个纯连接表,即只有两个外键的表。EF的一个功能是将这些表建模为多对多关联,而不在概念模型中创建类
将纯连接表作为实体类包含在模型中的最简单方法是
- 将虚拟字段临时添加到数据库表中
- 生成模型
- 从数据库中删除该字段
- 从数据库更新模型
- 删除edmx关系图中的属性
然而,我想知道你是否需要这样做。你似乎认为这与重复检查有关。但是,如果您想将
品牌
或产品
添加到数据库中,则必须以任何方式检查重复项。如果要添加新关联(例如,将现有品牌添加到Product.Brands),则无需检查它是否存在。如果是这样,EF只会忽略“新”关联。您的BrandToProd
表是一个纯连接表,即只有两个外键的表。EF的一个功能是将这些表建模为多对多关联,而不在概念模型中创建类
将纯连接表作为实体类包含在模型中的最简单方法是
- 将虚拟字段临时添加到数据库表中
- 生成模型
- 从数据库中删除该字段
- 从数据库更新模型
- 删除edmx关系图中的属性
然而,我想知道你是否需要这样做。你似乎认为这与重复检查有关。但是,如果您想将
品牌
或产品
添加到数据库中,则必须以任何方式检查重复项。如果要添加新关联(例如,将现有品牌添加到Product.Brands),则无需检查它是否存在。如果是这样,EF只会忽略“新建”关联。我最终只是将虚拟ID字段添加到我的连接表中,因为我经常更改DB模式(因为网站开发正在进行中,我需要不时从数据库更新模型),并且不希望每次都将虚拟字段删除/添加到数据库中。我使用过的另一个选项-两个表上的SQL视图和映射到EF中相应操作(CRUD)的存储过程,最后我只是将虚拟ID字段添加到我的连接表中,因为我经常更改DB模式(因为网站开发正在进行中,我需要不时从数据库更新模型)并且不希望每次都将虚拟字段删除/添加到数据库中。我使用的另一个选项是-SQL查看两个表和映射到EF中相应操作(CRUD)的存储过程,这是Gert回答的额外要点:
使用代理密钥时,始终存在重复管理问题。通常有一个或多个字段构成逻辑键。
你可以
- a) 在数据库上创建唯一索引。当违反约束时,Db将进行投诉
- b) 在尝试插入之前执行逻辑重复检查
- a) 在数据库上创建唯一索引。当违反约束时,Db将进行投诉
- b) 在尝试插入之前执行逻辑重复检查
[ForeignKey]
之类的数据注释,还是在上下文中使用Fluent API?这当然是可能的,但我们需要更多的信息来指导我们的方法!一些问题:1)您是先使用代码还是先使用数据库?2) 如果先编写代码,您是在使用诸如[ForeignKey]
之类的数据注释,还是在上下文中使用Fluent API?这当然是可能的,但我们需要更多的信息来指导我们的方法!谢谢,这就是为什么我决定离开存储层去做他的工作,其他什么都不做,现在所有关于插入新数据之前重复检查的逻辑都在控制器级别完成谢谢,这就是为什么我决定离开存储层去做他的工作,其他什么都不做,现在所有关于插入新数据之前重复检查的逻辑都在控制器级别完成