使用可为空的备用(恰好是多个)外键检查INSERT上的行唯一性

时间:2018-08-16 14:54:31

标签: sql entity-framework

我正在使用EF Code First(核心),并且具有一个如下所示的角色表:

Id PK
Object1Id FK 
Object2Id FK
RoleId FK NOT NULL
UserId FK
UserGroupId FK

根据谁的角色,必须填写UserId或UserGroupId。 根据与该角色相关的对象类型的事实,必须填写Object1Id或Object2Id。

现在,我想防止将重复的数据插入到该表中,但是“唯一行”的定义如下:“以下组合是唯一的:[Object1Id,RoleId,UserId],[Object1Id,RoleId,UserGroupId], [Object2Id,RoleId,UserId],[Object2Id,RoleId,UserGroupId]”。

我尝试将以下内容添加到StorageContext:

modelBuilder.Entity<MyTable>().HasAlternateKey(c => new { c.RoleId, c.Object1Id, c.UserId });
modelBuilder.Entity<MyTable>().HasAlternateKey(c => new { c.RoleId, c.Object2Id, c.UserId });
modelBuilder.Entity<MyTable>().HasAlternateKey(c => new { c.RoleId, c.Object1Id, c.UserGroupId });
modelBuilder.Entity<MyTable>().HasAlternateKey(c => new { c.RoleId, c.Object2Id, c.UserGroupId });

但是,迁移不起作用,因为备用键不能包含可为空的字段。

是否有EF解决方案? 纯SQL解决方案也可以。但是什么是好东西?我正在考虑INSTEAD OF INSERT触发器,在该触发器中,我将选择一个值并仅在不存在的情况下才插入该值,但是我不是数据库专家,并且不确定这是否是合适的解决方案。

有什么想法吗?

解决方案 正如评论中很好地暗示的那样,它是我想要的唯一索引:

 modelBuilder.Entity<MyTable>().HasIndex(c => new { c.RoleId, c.Object1Id, c.UserId }).IsUnique();
    modelBuilder.Entity<MyTable>().HasIndex(c => new { c.RoleId, c.Object2Id, c.UserId }).IsUnique();
    modelBuilder.Entity<MyTable>().HasIndex(c => new { c.RoleId, c.Object1Id, c.UserGroupId }).IsUnique();
    modelBuilder.Entity<MyTable>().HasIndex(c => new { c.RoleId, c.Object2Id, c.UserGroupId }).IsUnique();

我希望只有这样才能“杀死”表演。

0 个答案:

没有答案
相关问题