Массив строки равен нулю. ASP.NET Core Entity Framework - PullRequest
0 голосов
/ 08 октября 2018

У меня есть классы, которые представлены следующим образом:

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, столбцы Назначения пустые.

Я пытаюсь отобразить данные без наследования, тогда в столбце «Назначения» указано правильное значение.Я подозреваю, что modelBuilder.Ignore<TankModel>(); вызывает эту проблему, но без этого свойства я не создаю миграцию.

Я борюсь с этой проблемой уже несколько часов и не вижу никаких решений.

Как я могу сохранить пункты назначения в моей базе данных?

1 Ответ

0 голосов
/ 08 октября 2018

Если вы используете 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...