在迁移的上下文中要保留什么?

What to keep in the Context with Migrations?

假设我有一个全新的应用程序,它应该使用 CodeFirst 迁移,它列出了 CitiesBuildings

我做了一个 ASP.NET 核心 API 应用程序来列出 CitiesDisctricts 的建筑物...

我的模特:

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

如果我只保留 Buildings,它不会创建其他两个表,这里有什么建议?

我需要展示建筑,但是否需要在Context中收集Building

或者只够获得Cities,然后"deep loading"我们可以恢复Districts和Buildings?

或者,反之亦然,我只需要 Buildings,然后我可以通过参考 Districts 和 Cities 从下到上恢复?

What should I keep in the BuildingsContext, to enable my first EF migration?

您需要在 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 注册到 startup.cs 中的 DI 容器。

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

最后,你 运行 里面的迁移命令在 PowerShell or Console 中。例如,在 PowerShell 内部。

Add-Migration InitialCreate
Update-Database