Что держать в контексте с миграциями? - PullRequest
0 голосов
/ 11 октября 2018

Предположим, у меня есть совершенно новое приложение, которое должно использовать миграцию CodeFirst, в котором перечислены Buildings из Cities.

Я делаю приложение ASP.NET Core API для вывода списка зданийDisctricts из Cities ...

Мои модели:

public class City
{
    public int CityId { get; set; }
    public string Name { get; set; }
    List<District> Districts { get; set; }
}
public class District
{
    public int DistrictId { get; set; }
    public string Name { get; set; }
    public int CityId { get; set; }
    List<Building> Buildings { get; set; }
}
public class Building
{
    public int DistrictId { get; set; }
    public int BuildingId { get; set; }
    public string Name { get; set; }
}

Что я должен держать в BuildingsContext, чтобы включить мою первую миграцию EF?

public class BuildingsContext : DbContext
{
    // should I use these two?
    // public DbSet<City> Cities { get; set; }
    // public DbSet<District> Districts { get; set; }

    public DbSet<Building> Buildings { get; set; }
}

Если я оставлю только «Здания», он не будет создавать две другие таблицы, какова здесь рекомендация?

Мне нужно отобразить «Здания», но есть ли необходимость в наборе Building вContext?

Или достаточно просто получить Citi es, а затем "глубокой загрузкой" мы можем восстановить District s и Building s?

Или, наоборот, мне нужно толькоBuilding с, и тогда я смогу восстановиться по ссылке District с и Citi с, снизу вверх?

enter image description here

1 Ответ

0 голосов
/ 12 октября 2018

Что я должен сохранить в BuildingsContext, чтобы включить мою первую миграцию EF?

Вам необходимо настроить свои модели внутри OnModelCreating.Например,

public partial class BuildingsContext : DbContext
{
    public BuildingsContext()
    {
    }

    public BuildingsContext(DbContextOptions<BuildingsContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Building> Building { get; set; }
    public virtual DbSet<City> City { get; set; }
    public virtual DbSet<District> District { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Building>(entity =>
        {
            entity.Property(e => e.Name)
                .IsRequired()
                .HasMaxLength(50);

            entity.HasOne(d => d.District)
                .WithMany(p => p.Building)
                .HasForeignKey(d => d.DistrictId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Building_District");
        });

        modelBuilder.Entity<City>(entity =>
        {
            entity.Property(e => e.Name)
                .IsRequired()
                .HasMaxLength(50);
        });

        modelBuilder.Entity<District>(entity =>
        {
            entity.Property(e => e.Name)
                .IsRequired()
                .HasMaxLength(50);

            entity.HasOne(d => d.City)
                .WithMany(p => p.District)
                .HasForeignKey(d => d.CityId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_District_City");
        });
    }
}

Затем вы регистрируете DbContext в контейнере DI внутри startup.cs.

public class Startup
{
    ...
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddDbContext<BuildingsContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        ...
    }
    ...
}

Наконец, вы запускаете команду миграции внутри либо в PowerShell, либо в консоли .Например, внутри PowerShell.

Add-Migration InitialCreate
Update-Database
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...