Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 创建复合密钥和唯一安全多租户_Entity Framework_Entity Framework 6 - Fatal编程技术网

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

Entity framework 创建复合密钥和唯一安全多租户,entity-framework,entity-framework-6,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 N

在多租户应用程序中,我们可以强制输入另一个租户中的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生成我的模型?先用代码

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; }
}

我想你想要的是这样一个模型:

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; }
}
如果您想了解我在这个模型中使用的注释,可以检查以下内容

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

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

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

谢谢,这个想法是不允许添加客户,如果它没有相同的租户,并且如果我除了customerId之外还有其他属性?没错,拥有复合PKs可以确保您不会有具有相同“租户ID”的客户。“拥有另一个属性”是什么意思?例如,我有CustomerId,在property TenantId中使用ForeignKey(客户),如果是其他属性?groupId,otherIdIn int TenantId我可以有多个foreingkey吗?对不起,我的englishHello@Rod,查看更新,我希望这是您的要求
  public class Customer
  {
     //...
     [ForeignKey("Group")
     public int GroupId { get; set; }

     public virtual Group Group { get; set; }
  }