EF 核心迁移
EF Core migration
我有一个工作的 Web 应用程序(端点)包含一些方法并连接到 sql 服务器中的两个 table。这个应用程序完全是我自己在一个ashx文件中从头开始实现的,不遵循任何新的或旧的架构,只是ashx文件中的一些方法被远程调用并处理客户端的需求。客户端和服务器之间存在用于数据处理的共享 DLL。
由于某些原因,我想将客户端升级到Dot Net core,因此需要升级公共DLL,最后是端点。
现在遇到的问题是EF Core只支持代码优先,但是脚手架是有办法的。我从 Microsoft tutorials 开始。然后我看到 There are certain ways for migrating and scaffolding existing database,但我在使用命令“dotnet ef dbcontext scaffold”Data Source = ...“的第一步中被困了几个小时。然后通常教程材料与其他技术相结合,如asp.net核心速度非常快,我需要阅读大量技术才能完成一项简单的任务。
我担心我走错了路。只有两个 table,我可以手动实现 table 结构。没有任何示例代码可以修改它的 table 定义并且我可以很快重新启动我的项目吗?如果事情如此困难,我将从我的项目中省略 EF,并通过文本 sql 查询重新定义整个端点逻辑。
I can implement table structure by hand.
太棒了。只需为您的每个实体创建一个 DbContext 子类型,该子类型具有一个 DbSet。脚手架的唯一作用就是节省您的时间。
这是 SQL 服务器的完整示例:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Order> Orders { get; } = new HashSet<Order>();
}
public class Order
{
public int CustomerId { get; set; }
public int Id { get; set; }
public Customer Customer { get; set; }
}
public class Db : DbContext
{
string connectionString = "Server=localhost; database=efcore5test; integrated security = true;TrustServerCertificate=true;";
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders{ get; set; }
public Db(string connectionString) : base()
{
this.connectionString = connectionString;
}
public Db() : base()
{
this.Database.SetCommandTimeout(180);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var constr = this.connectionString;
optionsBuilder.LogTo(Console.WriteLine);
optionsBuilder.UseSqlServer(constr, o => o.UseRelationalNulls().CommandTimeout(180).UseNetTopologySuite());
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().HasKey(o => new { o.CustomerId, o.Id });
base.OnModelCreating(modelBuilder);
}
}
我有一个工作的 Web 应用程序(端点)包含一些方法并连接到 sql 服务器中的两个 table。这个应用程序完全是我自己在一个ashx文件中从头开始实现的,不遵循任何新的或旧的架构,只是ashx文件中的一些方法被远程调用并处理客户端的需求。客户端和服务器之间存在用于数据处理的共享 DLL。 由于某些原因,我想将客户端升级到Dot Net core,因此需要升级公共DLL,最后是端点。
现在遇到的问题是EF Core只支持代码优先,但是脚手架是有办法的。我从 Microsoft tutorials 开始。然后我看到 There are certain ways for migrating and scaffolding existing database,但我在使用命令“dotnet ef dbcontext scaffold”Data Source = ...“的第一步中被困了几个小时。然后通常教程材料与其他技术相结合,如asp.net核心速度非常快,我需要阅读大量技术才能完成一项简单的任务。
我担心我走错了路。只有两个 table,我可以手动实现 table 结构。没有任何示例代码可以修改它的 table 定义并且我可以很快重新启动我的项目吗?如果事情如此困难,我将从我的项目中省略 EF,并通过文本 sql 查询重新定义整个端点逻辑。
I can implement table structure by hand.
太棒了。只需为您的每个实体创建一个 DbContext 子类型,该子类型具有一个 DbSet。脚手架的唯一作用就是节省您的时间。
这是 SQL 服务器的完整示例:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Order> Orders { get; } = new HashSet<Order>();
}
public class Order
{
public int CustomerId { get; set; }
public int Id { get; set; }
public Customer Customer { get; set; }
}
public class Db : DbContext
{
string connectionString = "Server=localhost; database=efcore5test; integrated security = true;TrustServerCertificate=true;";
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders{ get; set; }
public Db(string connectionString) : base()
{
this.connectionString = connectionString;
}
public Db() : base()
{
this.Database.SetCommandTimeout(180);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var constr = this.connectionString;
optionsBuilder.LogTo(Console.WriteLine);
optionsBuilder.UseSqlServer(constr, o => o.UseRelationalNulls().CommandTimeout(180).UseNetTopologySuite());
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>().HasKey(o => new { o.CustomerId, o.Id });
base.OnModelCreating(modelBuilder);
}
}