Мне нравится добавлять некоторые данные в столбец из метода, а не из свойства. Возможно ли это как-то в EF Core?
Например, код конфигурации может выглядеть так:
internal class MyEntityTypeConfiguration : IEntityTypeConfiguration<MyEntity>
{
public void Configure(EntityTypeBuilder<MyEntity> builder)
{
builder.ToTable("Table1");
// Add column "Value1" and set it with the return value of myEntity.GetValue()
builder.Property<string>("Value1").WithValue(myEntity => myEntity.GetValue()); // TODO create WithValue
builder.HasKey(o => o.Id);
}
}
, в этом случае метод WithValue
не будет существовать.
Пример:
Например, я сохраню 2 объекта.
GetValue()
для возвратов объекта 1 "I am Entity 1"
GetValue()
для возвратов объекта 2 "I am Entity 2"
Тогда мне нравится магазин "I am Entity 1"
и "I am Entity 2"
в столбце Value1
Решение
Решение Jairo с ValueGenerator
отлично сработало для меня! Я сделал WithValue
так:
internal class ValueRetriever<TEntityEntry, TResult> : Microsoft.EntityFrameworkCore.ValueGeneration.ValueGenerator<TResult>
{
private readonly Func<TEntityEntry, TResult> _retrieve;
public ValueRetriever(Func<TEntityEntry, TResult> retrieve)
{
_retrieve = retrieve;
}
public override bool GeneratesTemporaryValues => false;
public override TResult Next(EntityEntry entry) => _retrieve((TEntityEntry)entry.Entity);
}
WithValue
расширение:
public static void WithValue<TEntityEntry, TResult>(this PropertyBuilder<TResult> propertyBuilder, Func<TEntityEntry, TResult> retrieve)
{
propertyBuilder.HasValueGenerator((property, type) => new ValueRetriever<TEntityEntry, TResult>(retrieve));
}
Использование:
builder
.Property<string>("Value1")
.WithValue<MyEntity, string>(myEntity => myEntity.GetValue());