C# EF Core从方法而不是属性保存值
我喜欢向列中添加一些数据,这些数据来自方法而不是属性。这在EF Core中是否可能 例如,配置代码可能如下所示:C# EF Core从方法而不是属性保存值,c#,entity-framework-core,entity-framework-core-3.0,C#,Entity Framework Core,Entity Framework Core 3.0,我喜欢向列中添加一些数据,这些数据来自方法而不是属性。这在EF Core中是否可能 例如,配置代码可能如下所示: 内部类MyEntityTypeConfiguration:IEntityTypeConfiguration { 公共void配置(EntityTypeBuilder) { 建筑商:可转帐(“表1”); //添加列“Value1”,并使用myEntity.GetValue()的返回值对其进行设置 builder.Property(“Value1”).WithValue(myEntity
内部类MyEntityTypeConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商:可转帐(“表1”);
//添加列“Value1”,并使用myEntity.GetValue()的返回值对其进行设置
builder.Property(“Value1”).WithValue(myEntity=>myEntity.GetValue());//TODO create WithValue
HasKey(o=>o.Id);
}
}
在这种情况下,WithValue
方法将不存在
例子:
例如,我将保存2个实体
GetValue()
返回“我是实体1”
GetValue()
返回“我是实体2”
Value1
中存储“我是实体1”
和“我是实体2”
解决方案
Jairo的ValueGenerator
解决方案非常适合我!我用value制作了,如下所示:
内部类值检索器:Microsoft.EntityFrameworkCore.ValueGeneration.ValueGenerator
{
私有只读函数检索;
公共价值检索器(Func检索)
{
_检索=检索;
}
public override bool GeneratesTemporaryValues=>false;
public override TResult Next(EntityEntry entry)=>\u retrieve((tentyentry)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));
}
public static void with value(此PropertyBuilder PropertyBuilder,Func检索)
{
HasValueGenerator((属性,类型)=>newvalueretriever(检索));
}
用法:
builder
.Property<string>("Value1")
.WithValue<MyEntity, string>(myEntity => myEntity.GetValue());
builder
.财产(“价值1”)
.WithValue(myEntity=>myEntity.GetValue());
我想我能帮你
EF Core shadow属性允许您定义和持久化非域数据,即类中未定义的数据。在DbContext中定义阴影属性,并使用DbContext设置其值
要定义它们,请执行以下操作:
modelBuilder.Entity<MyEntity>().Property<String>("Value1");
此外,您还可以使用extension方法设置一个值生成器,该生成器可以从您的实体获取值:
modelBuilder.Entity<MyEntity>().Property<string>("Value1").HasValueGenerator<ValueGenerator>();
实体:
class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
public string GetValue() => $"My Name: {Name}";
}
我想我能帮你
EF Core shadow属性允许您定义和持久化非域数据,即类中未定义的数据。在DbContext中定义阴影属性,并使用DbContext设置其值
要定义它们,请执行以下操作:
modelBuilder.Entity<MyEntity>().Property<String>("Value1");
此外,您还可以使用extension方法设置一个值生成器,该生成器可以从您的实体获取值:
modelBuilder.Entity<MyEntity>().Property<string>("Value1").HasValueGenerator<ValueGenerator>();
实体:
class MyEntity
{
public int Id { get; set; }
public string Name { get; set; }
public string GetValue() => $"My Name: {Name}";
}
你到底想解决什么问题?类型MyEntity
将始终具有相同的值。为什么要将其保存到数据库中?当保存多个实体时,值当然会不同。我仍然不确定你想要实现什么。您可以再详细说明一下。有一种方法可以配置EF Core以使用SQL生成的属性值。添加示例,但也添加了感谢Jairo Alfaro的解决方案:)您到底想解决什么问题?类型MyEntity
将始终具有相同的值。为什么要将其保存到数据库中?当保存多个实体时,值当然会不同。我仍然不确定你想要实现什么。你能再详细一点吗?有一种方法可以配置EF Core使用SQL生成的属性值。添加示例,还有感谢Jairo Alfaro的解决方案:)啊,谢谢。不幸的是,我只能更改MyEntityTypeConfiguration,而不能更改调用代码。因此,我需要EntityTypeBuilder上的一些内容。如果可以选择HasValueGenerator扩展方法,请查看我的更改。非常好!ValueGenerator
方法正是我想要的:)啊,谢谢。不幸的是,我只能更改MyEntityTypeConfiguration,而不能更改调用代码。因此,我需要EntityTypeBuilder上的一些内容。如果可以选择HasValueGenerator扩展方法,请查看我的更改。非常好!ValueGenerator
方法正是我想要的:)