在SQL Server中强制实现一对多的关系

时间:2011-02-08 01:11:32

标签: sql-server entity-framework

我的数据库中有2个表。 表1“ OrderItems ”和表2“订单”。 每个“订单”可以包含零个或多个“ OrderItems ”。 我定义了一个链接主键的FK约束:OrderId和OrderItemId,DeleteRule设置为'Cascade'。 这可确保在删除订单时删除所有OrderItem。

我需要避免的是空订单。我需要确保订单至少一个 OrderItem ,否则应在删除最后一个链接的 OrderItem 时自动删除。我当然可以在我的应用程序中检查这个,但理想情况下db可以处理这个问题。

我正在使用MS SQL Server 2008和Entity Framework作为我的ORM。

谢谢!

4 个答案:

答案 0 :(得分:1)

此双向关系可能无法在db架构中强制执行。您可能需要在业务逻辑中强制执行此操作。

答案 1 :(得分:1)

我不知道基于约束的方法来做到这一点。您可能会成功触发OrderItem表中的删除操作,检查“无子”Order记录并删除这些记录......但这可能是一个重量级的“沸腾海洋”方法,你可能最好在业务逻辑中捕获这种情况,正如@rcravens所建议的那样。

答案 2 :(得分:1)

考虑UPDATE TRIGGER来检查您是否有剩余订单商品,然后归档订单。

这将触发表中某一行的每次更改,因此您应该仔细考虑逻辑和相关的性能影响。

答案 3 :(得分:1)

这种关系不能使用普通的关系规则强制执行;毕竟,你会如何添加订单?如果您无法在没有订单的情况下添加订单商品,但是如果没有订单商品则无法订购任何订单,则会遇到鸡蛋或鸡蛋的情况。

您唯一真正的解决方案是在OrderItem表上创建删除触发器,如果​​它是最后一项,则删除相应的订单。