bev*_*qua 3 sql-server entity-framework
我有一个Post实体和一个FbPost实体.
Post.FbPost是null或a FbPost,并且没有两个Post实体可以引用同一个FbPost实体.换句话说,zero-or-one to one.
什么是执行此作为适当的方式zero-or-one to one,而不是many to one在SQL Server(理想)?
如果那是不可能的,我该如何在EF级别强制执行此操作?
通常,您可能会尝试将外键(在源表中)置为可空并在其上放置唯一约束.
它可以为空的事实意味着您可以在源表中有一个空条目,该条目不引用目标表中的条目.并且,如果它不为null,则唯一约束确保源表中只有一行可以引用目标表中的行.
不幸的是,至少对于SQL Server (a),唯一约束列中的NULL也必须是唯一的,尽管这会"破坏"SQL指南,即NULL不等于任何值,包括另一个NULL.所以基本上,这种方法不适用于SQL Server.
解决这个窘境(b)的一种可能方法是具有可空列的外键约束,但没有唯一约束.这将允许您确保您根本不引用目标表中的行(源表中的NULL)或引用目标行(源表中的任何非NULL值).
但是,它不会为您提供"只有一个源行可以引用目标行"的要求.这可以添加一个before(插入/更新)触发器,该触发器将检查源表中的每隔一行以确保没有其他行已经引用目标行.
而且你几乎总是喜欢数据库本身的约束.您永远不知道恶意应用程序(恶意或错误)何时连接到您的数据库并决定不遵守规则.
(a)从这里开始的以下文本显示了对几个DBMS产品中可空的唯一列的不同支持:
标准:
如约束名称所示,具有UNIQUE约束的(一组)列可能仅包含唯一(组合)值.
除非DBMS实现可选的"允许NULL"功能(功能ID 591),否则受UNIQUE约束约束的列或一组列也必须遵循NOT NULL约束.可选功能为UNIQUE约束添加了一些额外的特性:
首先,UNIQUE约束中涉及的列也可能具有NOT NULL约束,但它们不必具有.其次,如果具有UNIQUE约束的列也不具有NOT NULL约束,则列可以包含任意数量的NULL'值'(NULL不等于NULL的逻辑结果).
PostgreSQL的:
遵循标准,包括可选的NULL允许功能.
DB2:
遵循UNIQUE约束的非可选部分.不实现可选的NULL允许功能.
MSSQL:
跟随标准扭曲.
MSSQL提供允许NULL的功能,但如果允许NULL,则允许最多一个NULL'值'实例.换句话说,它破坏了标准的上述描述中的特征2.
MySQL的:
遵循标准,包括可选的NULL允许功能.
甲骨文:
遵循标准,关于多列UNIQUE约束.
实现了可选的NULL允许特征:如果对单个列施加UNIQUE约束,则该列可以包含任意数量的NULL(如上面标准描述中的特征2所预期的那样).但是,如果为多个列指定了UNIQUE-constraint,那么Oracle会将约束视为违反任何两行
(b)另一种方法当然是选择实现此功能的DBMS,如PostgreSQL或MySQL.
在您的具体情况下,这可能是不可能的,但至少应该考虑它.例如,我避开Oracle,因为它无法从某些字符列中的空字符串中辨别NULL,尽管其他人可能不像我那样"纯粹主义"(我的妻子会说"肛门保留"):-)
创建唯一的过滤索引:
CREATE UNIQUE INDEX Post_Unq_FbPost ON dbo.Post(FbPost) WHERE FbPost IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
当然,还要创建一个外键。
| 归档时间: |
|
| 查看次数: |
3908 次 |
| 最近记录: |