无法在 EF Core 2.2 中配置延迟加载以切断卸载的部件



当我调用API时,我会得到以下内容。当成员链接到的房客实体将开始列出其成员实体时,它会在中间分解。

{
" ID":" 00000000-7357-000B-0001-000000000000",
" tenantid":" 00000000-7357-000A-0001-00000000000000",
"用户名":" user1",
"租户":{
" ID":" 00000000-7357-000A-0001-000000000000",
"名称":"第一个假人",
"成员":[

我配置了这样的懒惰加载。

services.AddDbContext<Context>(config => config
  .UseLazyLoadingProxies()
  .UseSqlServer(Configuration.GetConnectionString("Register")));

我应该如何更改代码,以使懒惰的实体无法获得服务?我希望它只能将一个空列表返回给客户。我应该将DTO用于此目的,而不是从DB返回吗?有关于根本不使用懒惰的API的话题。

[HttpGet("test1/{username}"), AllowAnonymous]
public IActionResult GetStuff(string userName)
{
  Member output;
  output = Context.Members
    .Include(e => e.Tenant)
    .Single(e => e.UserName == userName);
  return Ok(output);
}

我不确定Google的用途,我得到的所有命中都指向UseLazyLoadingProxies()援引。

这可能会有些长:但是这里。

听起来您的实体看起来像:

public partial class Member
{
   public virtual long Id { get; set; }
   public virtual List<Tenant> Tenants { get; set; }  //tables have fk relationship
}

 public partial class Tenant
{
   public virtual long Id { get; set; }
   public virtual List<Member> Members{ get; set; }  //tables have another fk relationship?
}

,然后为此方法:

[HttpGet("test1/{username}"), AllowAnonymous]
public IActionResult GetStuff(string userName)
{
  Member output;
  output = Context.Members
    .Include(e => e.Tenant)
    .Single(e => e.UserName == userName);
  return Ok(output);
}

我看到了几个问题,但我会尝试简短:

我不会直接执行控制器。但这应该起作用。

我认为您所看的正是。当对象实例化时,它将获得所有这些相关实体。包括基本上将您的语句转换为左键,外国键匹配的位置(EF调用这些导航属性(。

如果您不想要租户属性,则可以省略.include语句。除非这是更通用的(在这种情况下,使用其他模式和自动映射器的更强有力(。

希望您的数据库不会真正与FK关系,如果这样做,请尽快解决。

下一个问题是您可能不想要儿童属性列表,但是它在模型中,因此它们将在"那里"。尽管您的清单租户可能是null。虽然这对您来说可能很好,但现在。作为一般规则,当我看到API返回属性时,我希望某些东西要么不存在(该成员没有租户(,要么是错误的,例如我错过了第二个参数。这可能不是93.284%的时间,但要注意。

这开始介绍为什么汽车应用程序很棒。您的数据库模型,业务模型和视图可能有所不同。而且,您不应该直接返回数据库模型。控制应用程序的每个部分的数据是一个好主意。

您可以轻松减少代码,并删除航属性:

[HttpGet("test1/{username}"), AllowAnonymous]
public IActionResult GetStuff(string userName)
{   
  return Ok(Context.Members
    .Include(e => e.Tenant)
    .Single(e => e.UserName == userName));    
}

,但同样,业务层会更好:

[HttpGet("test1/{username}"), AllowAnonymous]
public IActionResult GetStuff(string userName)
{
  return Ok(MemberRepository.GetMember(userName));
}

我要强调的要点是创建一个视图模型。

例如,假设用户详细信息:

public class MemberDetail
{
   public string UserName {get; set;}
   public long UserId { get; set; }
   public string FullName { get; set; }
}

通过这种方式,视图始终完全接收您想要看到的东西,而不是额外的数据。将其添加到一个事实中,您可以确切知道MemberMemberDetail的每种使用将如何映射。

最新更新