【问题标题】:Migrate Entity Framework 4.0 to Core将实体框架 4.0 迁移到核心
【发布时间】:2020-08-18 06:48:14
【问题描述】:

我有一个使用 Entity Framwork 4.0 开发的旧项目,它使用了一些复杂的类型。由于需要将其迁移到 .NET Core,因此我创建了一个新项目,安装了所有必需的库并使用了命令

PM> Scaffold-DbContext "Server=ServerInstance; Database=DBName; Trusted_Connection=True;" 
             Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

在现有数据库上创建新模型。问题是它不会生成复杂类型的类。

我可以想象我可以用手动创建的复杂类型替换生成的属性,使用[ComplexType] 属性并使用OwnsOne 命令设置属性,但是如果有某种自动生成选项,我会徘徊。

有没有办法做到这一点?

【问题讨论】:

  • 数据库没有复杂类型的概念(也没有指示),因此无法自动获取它(除非 EF Core 识别出一些我怀疑的命名约定)。旧系统中的复杂类型很可能是手动创建/映射的,你必须在 EF Core 中手动重构它们(注意 EF Core 中没有[ComplexType] 属性,你可以使用Owned,但列名必须为所拥有类型的每个所有者使用流利的 API 进行映射)。
  • 您在 OwnsOne 方法构建器操作中执行此操作 - 请参阅 stackoverflow.com/questions/53652135/…

标签: entity-framework-core entity-framework-migrations complextype


【解决方案1】:

我创建了第二个部分类,以便向创建的部分添加自定义内容。还添加了一个部分 OnModelCreatingPartial 方法,我在其中定义了我的复杂类型。

这里是一个sn-p:

[Owned]
public class MyComplexType
{
    public bool AField { get; set; }
    public string BField { get; set; }
}

public partial class MyMainEntity
{
    public MyComplexType MyComplexType { get; set; }
}

public partial class MyDbContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("myConnectionString",
                opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds)
            );
        }
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyMainEntity>().OwnsOne(e => e.MyComplexType, myComplexType =>
        {
            myComplexType.Property(p => p.AField).HasColumnName("ColumnNameFieldA");
            myComplexType.Property(p => p.BField).HasColumnName("ColumnNameFieldB");
        });
    }
}

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 2021-06-27
    • 2021-09-01
    • 1970-01-01
    • 2017-04-06
    • 2019-11-08
    • 2022-01-28
    • 2019-02-25
    • 2018-12-05
    相关资源
    最近更新 更多