EF4并故意仅返回*某些实体属性*

时间:2011-07-14 15:55:32

标签: wcf entity-framework-4

伙计们,我知道我并没有很好地说出这个标题,但这是场景。

我有一个WinForm UI层和一个WCF中间层,为我的EF4实体对象提供服务,这些对象(当然)映射到我的数据库表。一切正常。

我的一个对象是客户端 - 在客户端数据库表中是PDF文档的三个varbinary(max)字段。所以我的实体对象有三个Byte()属性,每个文档一个。

但是当我加载一个列出客户端的初始网格时,它将从MT拖动所有PDF数据 - 产生比我通常需要的更大的有效载荷。

使用DataSet,我会将我的SQL编写为不包含PDF二进制文件 - 但我会为每个包含一个布尔标志字段,以指示在用户需要时是否有一个要下载的字段。然后我根据需要通过单独的调用加载PDF。

使用EF4 - 最好的模式是什么?

首先,我正在考虑将文档放入子表/子对象中,因此我不会通过客户端将其拉到层。一个问题解决了。

其次,我想我可以使用部分类来扩展我的Client实体对象,以获得我想要的三个布尔属性。

我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:3)

我认为你有三种选择:

1)创建一个自定义类,您可以将所需的属性投影到其中:

public class MySpecialSelection
{
    public int ID { get; set; }
    public string Name { get; set; }
    // more
    public bool HasPDFDoc1 { get; set; }
    public bool HasPDFDoc2 { get; set; }
    public bool HasPDFDoc3 { get; set; }
}

using (var context = new MyContext())
{
    var mySpecialSelectionList = context.MyEntities.Where(...some predicate...)
        .Select(e => new MySpecialSelection
        {
            ID = e.ID,
            Name = e.Name,
            // ...
            HasPdfDoc1 = (e.PdfDoc1 != null),
            HasPdfDoc2 = (e.PdfDoc2 != null),
            HasPdfDoc3 = (e.PdfDoc3 != null),
        }).ToList();

    // ...
}

您也可以投射到匿名类型而不是“命名”对象。

注意:这不会将任何完整的模型实体附加到上下文中,因此您不会对实体进行任何更改跟踪。

2)表拆分:这意味着您将单个实体拆分为两个由导航属性相关的独立类。您可以将两个实体映射到数据库中的单个表。它允许您根据请求加载导航属性(例如二进制字段)(通过延迟,急切或明显加载)。有关EF4.0的详细信息,请参阅here和EF4.1 here

3)您自己的建议:创建单独的表和由导航属性和FK约束链接的单独实体。