首页 > 解决方案 > 字符串数组为空 ASP.NET Core Entity Framework

问题描述

我有一个类,如下所示:

public abstract class TankModel
{
    protected static readonly char delimiter = ',';

    protected string _destinations = "";

    [Key]
    public int ID { get; set; }
    [NotMapped]
    public String[] Destinations
    {
        get
        {
            return _destinations.Split(delimiter);
        }
        set
        {
            _destinations = String.Join($"{delimiter}", value);
        }
[..........................]
    }
}

public class NormalTank : TankModel
{
    public double VolumeTotal { get; set; }
[.........]
}

我的 OnModelCreating 方法包含:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TankModel>().Property<string>("Outputs").HasField("_destinations");
            modelBuilder.Entity<TankModel>().ToTable("Tanks");
            modelBuilder.Ignore<TankModel>();
            modelBuilder.Entity<NormalTank>().HasBaseType<TankModel>();
[..................]
        }

当我显示 NormalTank 行时,Destinations 列是空的。

我试图在不继承的情况下显示数据,然后 Destinations 列具有正确的值。我怀疑这modelBuilder.Ignore<TankModel>();会导致这个问题,但如果没有这个属性,我不会构建迁移。

几个小时以来,我一直在与这个问题作斗争,但我没有看到任何解决方案。

如何在我的数据库中保存目的地?

标签: asp.net-coreentity-framework-core

解决方案


如果您使用的是 EF Core 2.1 或更高版本,则可以利用自定义ValueConverter.

例如对于以下课程:

public class Example
{
  public Example() { Values = new List<string>(); }
  public ICollection<string> Values { get; set; }
}

您可以简单地在您的DbContext

modelBuilder.Entity<Example>(b => b.Property(x => x.Values)
  .HasConversion(new StringCollectionToStringConverter()));

创建了一个转换器类,如下所示:

public class StringCollectionToStringConverter : ValueConverter<ICollection<string>, string>
{
  private static readonly Expression<Func<string, ICollection<string>>> ToListValue
    = str => str.Split('|', StringSplitOptions.RemoveEmptyEntries);

  private static readonly Expression<Func<ICollection<string>, string>> ToStringValue
    = list => string.Join('|', list);

  public StringCollectionToStringConverter(ConverterMappingHints mappingHints = null)
    : base(ToStringValue, ToListValue, mappingHints) { }

  public static ValueConverterInfo DefaultInfo
    => new ValueConverterInfo(typeof(ICollection<string>), typeof(string),
      i => new StringCollectionToStringConverter(i.MappingHints));
}

推荐阅读