Коллекция примитивов в Entity Framework без загрязнения модели
Когда-то давно я описывал типовой способ сохранения коллекции примитивов в базе для EF:
public class Brand
{
public int Id { get; set; }
public string Name { get; set; }
public string AltNamesJson
{
get { return JsonConvert.SerializeObject(this.AltNames); }
set { this.AltNames = JsonConvert.DeserializeObject<string[]>(value); }
}
public string[] AltNames { get; set; }
}
И на текущий момент меня такой подход уже не устраивает. Я не хочу загрязнять домен лишней зависимостью от Json.Net (как способа сериализации), в идеале вообще не хочу тащить в домен знание о том, как модель хранится - пусть это знание находится в проекте Persistence. И не хочу в модель тащить ненужные поля с NotMapped:
public class Brand
{
public Brand(int id, string name, string[] altNames)
{
this.ID = id;
this.Name = name;
this.AltNames = altNames;
}
public int ID { get; private set; }
public string Name { get; private set; }
public string[] AltNames { get; private set; }
}
Использую EF Core 3.0.
Как бы провернуть такую операцию? Это вообще возможно?
Сам посматриваю в сторону Shadow Property + Fluent Api
Тут Аршинов упоминает, что ОРМ всё лучше начинают работать с конструкторами, но что-то не понимаю, как де/сериализовать модель в базу.
Ответы (1 шт):
Спасибо @4per за подсказку, сделал на базе ValueConverter:
public class BrandConfiguration : IEntityTypeConfiguration<Brand>
{
public void Configure(EntityTypeBuilder<Brand> builder)
{
builder.Property(e => e.AltTitles)
.HasConversion(JsonValueConverter());
}
private static ValueConverter<string[], string> JsonValueConverter()
{
return new ValueConverter<string[], string>(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<string[]>(v)
);
}
}
Документация: