Исключение выдается при использовании нескольких объектов-значений одного типа в EF-Core 2.0 - PullRequest
0 голосов
/ 17 мая 2018

У меня есть эта сущность BankLayoutSettings (упрощенная для краткости):

public class BankLayoutSettings
{
    public Guid BankId { get; set; }
    public Color HeaderAndFooterBackgroundColor { get; set; }
    public Color HeaderForeColor { get; set; }
    public Color FooterForeColor { get; set; }
    public Color TitlesForeColor { get; set; }
}

где Color выглядит так (также упрощенно для краткости):

  [TypeConverter(typeof(ColorTypeConverter))]
  public sealed class Color
  {
    [UsedImplicitly]
    private string _hashPrefixedHexTriplet;

    public static Color FromHashPrefixedHexTriplet(string hashPrefixedHexTriplet)
    {
      return new Color(hashPrefixedHexTriplet);
    }

    private Color()
    {
    }

    private Color(string hashPrefixedHexTriplet)
    {
      _hashPrefixedHexTriplet = hashPrefixedHexTriplet;
    }

    public string ToHashPrefixedHexTriplet()
    {
      return _hashPrefixedHexTriplet;
    }
  }

И TypeConverter выглядит так:

  public class ColorTypeConverter : TypeConverter
  {
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
      return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
      if (value is string) return Color.FromHashPrefixedHexTriplet(value as string);

      return base.ConvertFrom(context, culture, value);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
      if (destinationType == typeof(string)) return ((Color) value).ToHashPrefixedHexTriplet();
      return base.ConvertTo(context, culture, value, destinationType);
    }
  }

В DbContext он настроен примерно так:

modelBuilder.Entity<BankLayoutSettings>(b =>
      {
        b.HasKey(x => x.BankId);
        b.OwnsOne(o => o.HeaderAndFooterBackgroundColor).Property("_hashPrefixedHexTriplet").HasColumnName(nameof(Domain.Model.BankLayoutSettings.HeaderAndFooterBackgroundColor));
        b.OwnsOne(o => o.HeaderForeColor).Property("_hashPrefixedHexTriplet").HasColumnName(nameof(Domain.Model.BankLayoutSettings.HeaderForeColor));
        b.OwnsOne(o => o.FooterForeColor).Property("_hashPrefixedHexTriplet").HasColumnName(nameof(Domain.Model.BankLayoutSettings.FooterForeColor));
        b.OwnsOne(o => o.TitlesForeColor).Property("_hashPrefixedHexTriplet").HasColumnName(nameof(Domain.Model.BankLayoutSettings.TitlesForeColor));
      });

Чтобы сохранить его, я сначала устанавливаю BankId для идентификатора существующего банка, а затем вызываю _context.Add (bankLayoutSettings)сопровождаемый _context.SaveChanges.Этот последний вызов выдает это исключение:

InvalidOperationException: Сущность BankLayoutSettings.HeaderAndFooterBackgroundColor # Color разделяет таблицу «BankLayoutSettings» с «BankLayoutSettings», но с этим типом нет объекта сто же значение ключа 'BankLayoutSettingsBankId: 1f397108-3769-4511-f8a3-08d5bb30d71a', которое было помечено как «добавленное».

Странно то, что Guid - это не то, что я установил в bankLayoutSettings.BankId.Во время отладки и просмотра измененных записей (ChangeTracker.Entries) я обнаружил, что в первом свойстве Color (HeaderAndFooterBackgroundColor) для его элемента BankId был задан правильный идентификатор банка (тот, который я установил), в то время как для других свойств Color были случайные направляющие.И я не понимаю, почему, поскольку все свойства Color имеют одинаковую обработку во всем коде.

Итак, я изменил свою сущность, включив в нее только первое свойство Color, и, конечно же, оно работало нормально, не бросаяисключение.

Я что-то не так делаю?Я запускаю неподдерживаемый сценарий с EF Core 2.0?

И более того, как я могу заставить эту работу работать правильно?

РЕДАКТИРОВАТЬ:

Установлена ​​связь между банком и BankLayoutSettingsвот так:

  modelBuilder.Entity<BankLayoutSettings>(b =>
    {
      b.HasOne<Bank>()
        .WithOne()
        .HasForeignKey<BankLayoutSettings>(x => x.BankId);
    }
  );
...