Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf EF4和故意只返回实体的*部分*属性_Wcf_Entity Framework 4 - Fatal编程技术网

Wcf EF4和故意只返回实体的*部分*属性

Wcf EF4和故意只返回实体的*部分*属性,wcf,entity-framework-4,Wcf,Entity Framework 4,伙计们,我知道我没有很好地表达这个标题,但下面是一个场景 我有一个WinFormUI层和一个WCF中间层,提供EF4实体对象,它们(当然)映射到我的数据库表。一切正常 我的一个对象是客户机,在客户机数据库表中有三个用于PDF文档的varbinary(max)字段。所以我的实体对象有三个Byte()属性,每个文档一个 但是,当我加载一个列出客户机的初始网格时,它会从机器翻译中拖出所有PDF数据,从而产生比我通常需要的更大的负载 对于数据集,我会编写不包含PDF二进制文件的SQL,但我会为每个数据集

伙计们,我知道我没有很好地表达这个标题,但下面是一个场景

我有一个WinFormUI层和一个WCF中间层,提供EF4实体对象,它们(当然)映射到我的数据库表。一切正常

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

但是,当我加载一个列出客户机的初始网格时,它会从机器翻译中拖出所有PDF数据,从而产生比我通常需要的更大的负载

对于数据集,我会编写不包含PDF二进制文件的SQL,但我会为每个数据集包含一个布尔标志字段,以指示如果用户需要,是否有一个可下载的数据集。然后我会根据需要通过单独的调用加载PDF

对于EF4,什么是最好的模式

首先,我想把文档放在一个子表/子对象中,这样我就不会把它拉到客户端的层上。解决了一个问题

其次,我想我可以使用分部类来扩展我的客户机实体对象,使其具有我想要的三个布尔属性


我走对了吗?

我想你有三个选择:

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的详细信息,请参阅和EF4.1


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

我认为您有三个选项:

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的详细信息,请参阅和EF4.1


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

非常感谢。我没有想过从一张桌子上做两件东西。非常好的主意。出现的另一个选项是在通过WCF发送到UI之前将我的三个Byte()字段设置为nothing,但添加三个“.Has”布尔字段。这样,一个对象告诉我它是否“拥有”每个文档,但它不将它们包含在有效负载中。当我在UI中需要一个文档时,我会完全通过另一个调用从DB/MT中提取它。结果是客户决定他无论如何都不需要数据库中的这些文档!哇!尽管如此,斯劳玛,我还是授予你优胜者的桂冠。非常感谢。我没有想过从一张桌子上做两件东西。非常好的主意。出现的另一个选项是在通过WCF发送到UI之前将我的三个Byte()字段设置为nothing,但添加三个“.Has”布尔字段。这样,一个对象告诉我它是否“拥有”每个文档,但它不将它们包含在有效负载中。当我在UI中需要一个文档时,我会完全通过另一个调用从DB/MT中提取它。结果是客户决定他无论如何都不需要数据库中的这些文档!哇!尽管如此,斯劳玛,我还是授予你优胜者的桂冠。