Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core从方法而不是属性保存值_C#_Entity Framework Core_Entity Framework Core 3.0 - Fatal编程技术网

C# 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

我喜欢向列中添加一些数据,这些数据来自方法而不是属性。这在EF Core中是否可能

例如,配置代码可能如下所示:

内部类MyEntityTypeConfiguration:IEntityTypeConfiguration
{
公共void配置(EntityTypeBuilder)
{
建筑商:可转帐(“表1”);
//添加列“Value1”,并使用myEntity.GetValue()的返回值对其进行设置
builder.Property(“Value1”).WithValue(myEntity=>myEntity.GetValue());//TODO create WithValue
HasKey(o=>o.Id);
}
}
在这种情况下,
WithValue
方法将不存在

例子: 例如,我将保存2个实体

  • 实体1的
    GetValue()
    返回
    “我是实体1”
  • 实体2的
    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
    方法正是我想要的:)