实体框架包含没有嵌套属性

时间:2015-01-23 15:48:17

标签: c# entity-framework asp.net-web-api

我有两个名为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而我只想包含用户指定的导航属性。

2 个答案:

答案 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集合,因为使用私有集只能在构造函数中赋值。