创建复合密钥和唯一 - 安全多租户

时间:2015-03-05 13:33:24

标签: entity-framework entity-framework-6

在多租户应用程序中,我们可以强制输入

中另一个租户中的ID

在SQL Server中,我解析如下:

CREATE TABLE tenant (
    id INT NOT NULL,
    nome VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE customer (
    id INT  NOT NULL,
    id_tenant INT  NOT NULL,
    nome VARCHAR(255) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (id_tenant) REFERENCES tenant(id),

    -- pra ter a FK composta, tem que ter chave composta na tabela de origem
    UNIQUE (Id,id_tenant)
);

CREATE TABLE [order]  (
    id INT  NOT NULL,
    id_customer INT  NOT NULL,
    id_tenant INT  NOT NULL,
    nome VARCHAR(255) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (id_customer, id_tenant) REFERENCES customer (id, id_tenant),
    FOREIGN KEY (id_tenant) REFERENCES tenant(id)
);

我如何使用我的模型进行映射? 如何使用上面的SQL生成我的模型?使用Code First?

public class Tenant
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Customer
{
    public int Id { get; set; }
    public int TenantId { get; set; }
    public string Name { get; set;}
}
public class Order
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public int TenantId { get; set; }

    public float Price { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我认为你要找的是这样的模型:

public class Tenant
{
    [Key]   
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}
public class Customer
{
    [Key,Column(Order = 0)]
    public int Id { get; set; }

    [Key,ForeignKey("Tenant"), Column(Order = 1)]
    public int TenantId { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual Tenant Tenant { get; set; }
}
public class Order
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Customer"), Column(Order = 0)]
    public int CustomerId { get; set; }

    [ForeignKey("Customer"), Column(Order = 1)]
    public int TenantId { get; set; }

    public decimal Price { get; set; }

    public virtual Customer Customer { get; set; }
}

如果您想了解我在此模型中使用的注释,您可以查看link

更新

是的,您可以在实体中添加多个FK属性作为其他关系配置的一部分,例如,假设您要将客户与组关联:

 public class Group
 {
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
    public virtual ICollection<Customer> Customers {get ; set;}
 }

然后,在您的Customer课程中,您可以将FK属性添加到组表中。加上这个:

  public class Customer
  {
     //...
     [ForeignKey("Group")
     public int GroupId { get; set; }

     public virtual Group Group { get; set; }
  }