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

  
}