Предположим, у меня есть класс сущностей Person
со свойством Address
.
public class Person
{
public Address Address { get; set; }
}
public class Address
{
public Address(string address)
{
// Retrieve the fields from a string
}
public string Street { get; set; }
public int Number { get; set; }
public override string ToString()
{
return $"{Street}; no. {Number}";
}
}
До сих пор я пробовал это:
public override void Configure(EntityTypeBuilder<Person> builder)
{
builder
.OwnsOne(x => x.Address, a =>
{
a.WithOwner();
a.Property(y => y.Street);
a.Property(y => y.Number);
});
base.Configure(builder);
}
This will map both Address.Street
and Address.Number
to their own column inside Person
's table (respectively Address_Street and Address_Number).
Я хочу отобразить все свойства Address
в таблице Person
как 1 столбец строки типа и сделать его значением, как описано в его методе ToString()
, и построить обратно из сохраненной строки, как описано в конструктор.
Как этого добиться?
Что произойдет, если вы измените это объединенное поле в своей базе данных? Вы можете использовать вычисляемые столбцы или представления в своей базе данных, если вам нужен такой столбец.
@Michael Я никогда не должен изменять это составное поле в своей базе данных. Ради этого вопроса мы можем предположить, что все инварианты и несоответствия обрабатываются приложением.
По моему опыту, всякий раз, когда есть возможность хранить примитивные данные, эту возможность следует использовать с благодарностью. Хранение обработанных данных является формой потери данных. Хорошо, это маловероятно, но улица или имя могут содержать строку "; no.". Более вероятно, что однажды соглашение о форматировании может измениться, требуя обновления всех полей. Поэтому мой совет: храните поля отдельно и добавляйте вычисляемое поле, которое возвращает отформатированную строку.
@GertArnold, что вы подразумеваете под вычисляемым полем?
Вычисляемый столбец AKA: database.guide/what-is-a-computed-column-in-sql-server
Также это можно сделать с помощью подхода «сначала код»: docs.microsoft.com/en-us/ef/core/modeling/… (новое в EF Core 5).
@GertArnold Хорошо, я последую вашему предложению, но просто для сведения: то, что я спросил, возможно даже при условии, что EF Core?
Если да, то не могли бы вы отправить ответ вместе с предложением не хранить вычисляемые данные?