У меня есть эта сущность 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);
}
);