我正在使用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();
我希望只有这样才能“杀死”表演。