我有两个名为DataTag和TagSource的相关实体,如下所示:
public class DataTag : BaseModel
{
[Column("DataTagId")]
public override Guid ID { get; set; }
public string Tag { get; set; }
public Guid TagSourceId { get; set; }
public TagSource TagSource { get; set; }
}
public class TagSource : BaseModel
{
[Column("TagSourceId")]
public override Guid ID { get; set; }
public string Description { get; set; }
public bool IsInternal { get; set; }
public string Source { get; set; }
public ICollection<DataTag> DataTags { get; set; }
}
我允许用户通过网址包含导航属性,例如“/ api / DataTags?Include = TagSource”。问题是当我包含TagSource时,它还包括该对象中的DataTags集合,除非用户指定它,否则我不想要它(例如“/api/DataTags?Include=TagSource.DataTags”。有什么办法吗?当我包含TagSource时停止加载该属性?我尝试将属性设置为虚拟并在全局范围内关闭延迟加载,但这不起作用。我没有将它们标记为虚拟的原因是因为我使用AutoMapper而我只想包含用户指定的导航属性。
答案 0 :(得分:0)
在评论中,您需要创建DTO对象。这里有一篇很好的文章详细介绍了如何使用WebAPI
执行此操作http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-5
编辑。
问题在于,每个可能的结果都需要很多不同的DTO对象,这些对象可能会变得混乱。如果您的返回类型是JSON,则可以将此属性添加到您的属性中:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
答案 1 :(得分:0)
首先:为我的英语道歉。
其次:我对使用这种方式创建外键的代码优先数据库模型有同样的问题:public virtual Collection<Object> Objects {get; set;}
我找到了一个解决方法,将属性设置器设置为私有:
public virtual Collection<Object> Objects {get; private set;}
然后EF无法填充Objects集合,因为使用私有集只能在构造函数中赋值。