Связать модели из разных баз данных - PullRequest
0 голосов
/ 20 ноября 2018

У меня следующая ситуация: у меня есть класс Company, он настолько прост, насколько это возможно

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

    public string Name { get; set; }
}

Мне также нужно расширить класс IdentityUser из ASP.NET Identity Core:

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

. Соответственно, мы добавляем свойство Devices типа List<Device> к классу Company и свойству Users типа List<User>.

Проблема в том, что я хочу отделить данные (таблицу устройств) от данных ASP .NET Identity Core в разных базах данных.Таблицу Company я хочу положить в базу данных с данными Auth.И настольное устройство в другом.Как я могу сообщить Entity Framework, что свойство Company класса Device принадлежит другой базе данных?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете попробовать установить свою модель 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 классе, затем переопределил FK в методеOnModelCreating.

После удаления элемента в таблице Company все элементы с одинаковым Id в таблице Devices (по сравнению с CompanyID) будут автоматически удалены .

Поскольку мы используем 2 свойства [Table] и [Key], чтобы определить имя таблицы и первичный ключ.Таким образом, в OnModelCreating можно игнорировать, чтобы определить имя, PK, FK таблицы Device.


Компания имеет много пользователей

ВВ этом случае:

Пользователь Класс:

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);
    };
}
0 голосов
/ 20 ноября 2018

Если свойство Company принадлежит другой базе данных, вам может потребоваться добавить второй контекст базы данных, если вы этого еще не сделали.Как то так:

public class CompanyModelContext : DbContext
{
    public CompanyModelContext(DbContextOptions options) : base(options){ }
    public DbSet<Company> Company { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...