代码之家  ›  专栏  ›  技术社区  ›  Maxim Zabolotskikh

使用可为null的备用外键(正好是许多外键中的一个)检查INSERT上的行唯一性

  •  1
  • Maxim Zabolotskikh  · 技术社区  · 6 年前

    我正在使用EF Code First(Core),并有一个角色表,如下所示:

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

    根据此角色所关联的对象类型,必须填充Object1Id或Object2Id。

    我尝试在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解决方案吗?

    有什么想法吗?

    解决方案

     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 回复  |  直到 6 年前