【问题标题】:Ef Core 2 set value to ignored property on runtimeEf Core 2 在运行时将值设置为忽略的属性
【发布时间】:2018-11-10 15:58:35
【问题描述】:

我有一个名为“ReadOnly”的具有布尔属性的实体,该属性的值取决于哪个用户正在使用该应用程序。

在 DbContext 中,我配置了要忽略的属性。

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Entity>().Ignore(e => e.ReadOnly);
    }
}

如何设置运行时计算的正确值,以免每次都提醒计算属性?

编辑:我在想类似的东西

int loggedUserId = HttpSession.UserId;
modelBuilder.Entity<Entity>().Property(e => e.ReadOnly).Value = loggedUserId > 5;

这样,我始终根据登录到应用程序的用户获得正确的值。

【问题讨论】:

  • 对不起,我不明白。您能否详细说明您真正想要实现的目标。
  • 您必须在每个进入的请求上设置属性。
  • 我的应用程序是一个微服务,MyDbContext 是在每个请求上创建的,所以我可以为每个请求设置属性,但我不知道该怎么做
  • Onmodelcreating 不会根据请求进行
  • 你是对的,我的意思是,loggedUserId 可以在每个请求上检索,例如多租户全局过滤器。gunnarpeipman.com/net/ef-core-global-query-filters

标签: c# .net-core ef-core-2.0


【解决方案1】:

您可以尝试使用filter,但我不确定它是否有效,因为您需要为每个请求设置属性。您最好的选择是在接受用户并返回计算值的类上创建一个方法。像这样的:

bool IsReadOnly(int userId){
return userId > 5;
}

【讨论】:

  • 我使用过滤器,但过滤器是过滤结果的布尔条件,我无法为属性设置值
【解决方案2】:

我发现 AutoMapper 有 ProjectTo 函数可以满足我的需要,ProjectTo 会告诉 AutoMapper 的映射引擎向 IQueryable 发出一个 select 子句

我的配置示例:

 configuration.CreateMap(typeof(Entity), typeof(Entity))
    .ForMember(nameof(Entity.IsReadOnly), opt.MapFrom(src => currentUserResolver.GetUserId() > 5));

用法:

myDbSet.AsQueryable().ProjectTo<TEntity>();

http://docs.automapper.org/en/stable/Queryable-Extensions.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多