当我调用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; }
}
通过这种方式,视图始终完全接收您想要看到的东西,而不是额外的数据。将其添加到一个事实中,您可以确切知道Member
对MemberDetail
的每种使用将如何映射。