EntityFramework 同表多对多关系

2024-03-30

我有一个名为“产品”的表,其中显然包含产品。 但是,我需要创建相关产品。所以我所做的就是创建一个名为product_related 的连接表,它有两个PK。 ProductID 来自 Products 表,RelatedID 也来自 Products 表。

我已经使用 EF 并在其他表上设置了所有内容。我应该如何正确添加它才能与产品建立关系,如下所示:product.Products.Add(product object here)。当然在这里product表示我使用从数据库获取的产品对象db.Products.FirstOr....

我应该如何正确地做到这一点?同一张表的多对多?

Thanks.


为了创建多对多关系数据库优先方法您需要设置遵循某些规则的数据库架构:

  • 创建一个Products有列的表ProductID作为主键
  • 创建一个ProductRelations有列的表ProductID和一列RelatedID并标记两列都作为主键(复合键)
  • 不要向其中添加任何其他列ProductRelations table。两个键列必须是表中唯一的列,才能让 EF 将该表识别为多对多关系的链接表
  • Create two foreign key relationships between the two tables:
    • 第一个关系有Products表作为主键表ProductID作为主键和ProductRelations表作为外键表只有ProductID作为外键
    • 第二个关系也有Products表作为主键表ProductID作为主键和ProductRelations表作为外键表只有RelatedID作为外键
  • Enable 级联删除对于这两种关系中的第一种。 (您不能对两者都执行此操作。SQL Server 不允许这样做,因为这会导致多个级联删除路径。)

如果您现在从这两个表生成实体数据模型,您将得到只有一个实体,即Product实体(或者也许Products如果禁用单一化)。链接表ProductRelations不会作为实体公开。

The Product实体将有两个导航属性:

public EntityCollection<Product> Products { get { ... } set { ... } }
public EntityCollection<Product> Products1 { get { ... } set { ... } }

这些导航集合是同一多对多关系的两个端点。 (如果您有两个不同的表,您想通过多对多关系链接,例如表A and B, 一个导航集合 (Bs) 将在实体中A和另一个 (As) 将在实体中B。但是因为您的关系是“自引用”,所以两个导航属性都在实体中Product.)

这两个属性的含义是:Products是与给定产品相关的产品,Products1是指给定产品的产品。例如:如果关系意味着某个产品需要其他产品作为零件来制造,并且您有产品“笔记本电脑”、“处理器”、“硅芯片”,那么“处理器”是made of“硅片”(“硅片”是一种元素Products的集合Processor产品实体)并且是used by一个“笔记本”(“笔记本”是Products1的集合Processor产品实体)。代替Products and Products1名字MadeOf and UsedBy那么会更合适。

如果您只对关系的一侧感兴趣,则可以安全地从生成的模型中删除其中一个集合。例如删除即可Products1在模型设计器界面中。您还可以重命名属性。这种关系仍然是多对多的。

Edit

正如评论中所问,模型和映射代码优先方法将会:

Model:

public class Product
{
    public int ProductID { get; set; }

    public ICollection<Product> RelatedProducts { get; set; }
}

Mapping:

public class MyContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>()
            .HasMany(p => RelatedProducts)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("ProductID");
                m.MapRightKey("RelatedID");
                m.ToTable("product_related");
            });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EntityFramework 同表多对多关系 的相关文章

  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 分组和切换列和行

    我不知道这是否会被正式称为枢轴 但我想要的结果是这样的 Alex Charley Liza 213 345 1 23 111 5 42 52 2 323 5 23 1 324 5 我的输入数据采用这种形式 Apt Name
  • 根据由另一列分组的不同列的最大值获取值[重复]

    这个问题在这里已经有答案了 我想根据由另一列分组的不同列的最大值来获取列的值 我有这张表 KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这样的结果 KEY V
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem

随机推荐