链接来自不同数据库的模型

时间:2018-11-20 03:31:53

标签: entity-framework asp.net-core ef-fluent-api

我有以下情况:我有一个Company公司,它尽可能简单

public class Company
{
    public int ID { get; set; } 

    public string Name { get; set; }
}

我还需要从ASP扩展IdentityUser类。 NET身份核心:

public class User : IdentityUser
{
    public Company Company { get; set; }

    public int CompanyID { get; set; }
}

到目前为止还不错。但是我还需要一个Device类:

public class Device
{
    public Company Company { get; set; }

    public int CompanyID { get; set; }
}

因此,我们将List<Device>类型的Devices属性添加到Company类中,并将List<User>类型的Users属性添加到Company类中。

问题是我想从不同数据库中的ASP .NET Identity Core数据中分离数据(设备表)。我想将表公司与Auth数据一起放入数据库。和表Device在另一个。如何告诉实体框架Device类的Company属性来自另一个数据库?

2 个答案:

答案 0 :(得分:1)

如果Company属性来自另一个数据库,则可能需要为其添加第二个数据库上下文。像这样:

public class CompanyModelContext : DbContext
{
    public CompanyModelContext(DbContextOptions options) : base(options){ }
    public DbSet<Company> Company { get; set; }
}

答案 1 :(得分:0)

您可以尝试像这样设置EF模型:

公司表:

[Table("Companies")]
public class Company
{
    [Key]
    public int ID { get; set; } 

    public string Name { get; set; }

    public ICollection<Device> Devices { get; set; }
}

设备表:

[Table("Devices")]
public class Device
{
    [Key]
    public int Id { get; set; }

    public Company Company { get; set; }

    public int CompanyID { get; set; }
}

ApplicationDbContext 类:

public DbSet<Company> Companies { get; set; }

public DbSet<Device> Devices { get; set; }

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Company>(buildAction =>
    {
        buildAction.ToTable("Companies");

        buildAction.HasMany(x => x.Devices)
                   .WithOne(x => x.Company)
                   .OnDelete(DeleteBehavior.Cascade);
    };
}

我在Devices类中添加了Company作为列表,然后在方法OnModelCreating中覆盖了FK。

一旦删除表Company中的一项,表Id中所有与Devices相同的项(与CompanyID相比)将被自动删除 < / em>。

由于我们使用2个属性[Table][Key]来定义表名和主键。因此,在OnModelCreating中,您可以忽略以定义表Device的名称,PK,FK。


  

公司有很多用户

在这种情况下:

User 类:

public class User : IdentityUser
{
    public int CompanyId { get; set; }

    public Company Company { get; set; }
}

公司类:

[Table("Companies")]
public class Company
{
    [Key]
    public int ID { get; set; } 

    public string Name { get; set; }

    public ICollection<Device> Devices { get; set; }

    public ICollection<User> Users { get; set; }
}

ApplicationDbContext 类:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Company>(buildAction =>
    {
        buildAction.ToTable("Companies");

        buildAction.HasMany(x => x.Devices)
                   .WithOne(x => x.Company)
                   .OnDelete(DeleteBehavior.Cascade);

        buildAction.HasMany(x => x.Users)
                   .WithOne(x => x.Company)
                   .OnDelete(DeleteBehavior.Cascade);
    };
}