Wcf EF4和故意只返回实体的*部分*属性
伙计们,我知道我没有很好地表达这个标题,但下面是一个场景 我有一个WinFormUI层和一个WCF中间层,提供EF4实体对象,它们(当然)映射到我的数据库表。一切正常 我的一个对象是客户机,在客户机数据库表中有三个用于PDF文档的varbinary(max)字段。所以我的实体对象有三个Byte()属性,每个文档一个 但是,当我加载一个列出客户机的初始网格时,它会从机器翻译中拖出所有PDF数据,从而产生比我通常需要的更大的负载 对于数据集,我会编写不包含PDF二进制文件的SQL,但我会为每个数据集包含一个布尔标志字段,以指示如果用户需要,是否有一个可下载的数据集。然后我会根据需要通过单独的调用加载PDF 对于EF4,什么是最好的模式 首先,我想把文档放在一个子表/子对象中,这样我就不会把它拉到客户端的层上。解决了一个问题 其次,我想我可以使用分部类来扩展我的客户机实体对象,使其具有我想要的三个布尔属性Wcf EF4和故意只返回实体的*部分*属性,wcf,entity-framework-4,Wcf,Entity Framework 4,伙计们,我知道我没有很好地表达这个标题,但下面是一个场景 我有一个WinFormUI层和一个WCF中间层,提供EF4实体对象,它们(当然)映射到我的数据库表。一切正常 我的一个对象是客户机,在客户机数据库表中有三个用于PDF文档的varbinary(max)字段。所以我的实体对象有三个Byte()属性,每个文档一个 但是,当我加载一个列出客户机的初始网格时,它会从机器翻译中拖出所有PDF数据,从而产生比我通常需要的更大的负载 对于数据集,我会编写不包含PDF二进制文件的SQL,但我会为每个数据集
我走对了吗?我想你有三个选择: 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中提取它。结果是客户决定他无论如何都不需要数据库中的这些文档!哇!尽管如此,斯劳玛,我还是授予你优胜者的桂冠。