从实体框架迁移中的复杂对象创建字段时出错

从实体框架迁移中的复杂对象创建字段时出错

本文介绍了从实体框架迁移中的复杂对象创建字段时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在研究将 Entity Framework 迁移到 .Net Core,当我执行迁移时出现错误.问题在于将字段创建为复杂字段.

I am studying Entity Framework migration to .Net Core and when I will execute the migration I get an error. The problem is in create field to a complex field.

我有配置类并在调试中执行代码.

I have the config class and in debug the code is executed.

配置类

public void Configure(EntityTypeBuilder<City> builder)
{
    base.Configure(builder);

    builder.Property(x => x.Name)
        .IsRequired()
        .HasColumnType(VARCHAR)
        .HasMaxLength(150);
    builder.Property(x => x.Initials)
        .HasColumnType(VARCHAR)
        .HasMaxLength(5);
    builder.Property(x => x.Code)
        .HasColumnType(VARCHAR)
        .HasMaxLength(5);
    builder.Property(x => x.State)
        .HasColumnType(UNIQUEIDENTIFIER)
        .IsRequired();
    }

我的上下文类

public class DataContext: DbContext
{
    protected virtual DbSet<Country> Country { get; set; }
    protected virtual DbSet<State> State { get; set; }
    protected virtual DbSet<City> City { get; set; }

    public DataContext()
    { }

    public DataContext(DbContextOptions<DataContext> opcoes)
        :base(opcoes)
    { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ForSqlServerUseIdentityColumns();
        modelBuilder.HasDefaultSchema("MCDATA");

        new CountryConfig().Configure(modelBuilder.Entity<Country>());
        new StateConfig().Configure(modelBuilder.Entity<State>());
        new CityConfig().Configure(modelBuilder.Entity<City>());
    }
}

public class BaseEntity
{
    public Guid Id { get; set; }
    public DateTime RegisterDate { get; set; }
    public DateTime LastChangeDate { get; set; }
    public Status Status { get; set; }
}

public class City: BaseEntity, IEquatable<City>
{
    public string Name { get; set; }
    public string Initials { get; set; }
    public string Code { get; set; }
    public State State { get; set; }

    public bool Equals(City other)
    {
        throw new NotImplementedException();
    }
}

public class State: BaseEntity, IEquatable<State>
{
    public string Name { get; set; }
    public string Code { get; set; }
    public string Initials { get; set; }
    public Country Country { get; set; }

    public bool Equals(State other)
    {
        throw new NotImplementedException();
    }
}

public DataContext CreateDbContext(string[] args)
{
    var construtor = new DbContextOptionsBuilder<DataContext>();
    construtor.UseSqlServer(CONNECTIONSTRING);
    return new DataContext(construtor.Options);
}

问题出在context.Database.Migrate();

var context = dbFactory.CreateDbContext(new string[] {});
context.Database.Migrate();

消息是:

System.InvalidOperationException: 'The property 'City.State' 的类型为 'State',当前数据库提供程序不支持.更改属性 CLR 类型或使用[NotMapped]"属性或使用OnModelCreating"中的EntityTypeBuilder.Ignore"忽略该属性

推荐答案

在 CityConfig 类中更改代码:

In the CityConfig class change the code:

    public override void Configure(EntityTypeBuilder<City> builder)
    {
        base.Configure(builder);

        builder.Property(x => x.Name)
            .IsRequired()
            .HasColumnType(VARCHAR)
            .HasMaxLength(150);
        builder.Property(x => x.Initials)
            .HasColumnType(VARCHAR)
            .HasMaxLength(5);
        builder.Property(x => x.Code)
            .HasColumnType(VARCHAR)
            .HasMaxLength(5);
        // Remove this
        //builder.Property(x => x.State)
        //    .HasColumnType(UNIQUEIDENTIFIER)
        //    .IsRequired();

        // Add this
        builder
            .HasOne(y => y.State)
            .WithMany();
    }

这篇关于从实体框架迁移中的复杂对象创建字段时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-30 01:15