在迁移的上下文中要保留什么?
What to keep in the Context with Migrations?
假设我有一个全新的应用程序,它应该使用 CodeFirst 迁移,它列出了 Cities
的 Buildings
。
我做了一个 ASP.NET 核心 API 应用程序来列出 Cities
的 Disctricts
的建筑物...
我的模特:
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
?
或者只够获得Citi
es,然后"deep loading"我们可以恢复District
s和Building
s?
或者,反之亦然,我只需要 Building
s,然后我可以通过参考 District
s 和 Citi
es 从下到上恢复?
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
假设我有一个全新的应用程序,它应该使用 CodeFirst 迁移,它列出了 Cities
的 Buildings
。
我做了一个 ASP.NET 核心 API 应用程序来列出 Cities
的 Disctricts
的建筑物...
我的模特:
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
?
或者只够获得Citi
es,然后"deep loading"我们可以恢复District
s和Building
s?
或者,反之亦然,我只需要 Building
s,然后我可以通过参考 District
s 和 Citi
es 从下到上恢复?
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