我正在处理的项目中有很多相关的实体,我正在使用WCF在多个客户端应用程序中使用它们。我很快就意识到我每次调用都会在数据库中序列化一半的数据。我解决了即时问题,但系统仍在进行大量的数据库调用,因为我的服务层对象遍历构造函数中数据层中的所有嵌套对象。很多时候这是完全没有必要的,所以我开始考虑替代方案。实体框架虚拟属性和数据库访问Id属性?
如果我指定我的嵌套属性的ID,那么我不相信数据库调用是除非我访问嵌套对象的属性。
public class MyDataObject
{
public Guid Id { get; set; }
public string SomeProperty { get; set; }
public Guid NestedDataObjectId { get; set; }
[ForeignKey("NestedDataObjectId")]
public virtual NestedDataObject NestedDataObject { get; set; }
}
然后我就可以用我的服务对象的构造,以确定是否延迟加载嵌套对象是这样的:
public class MyServiceObject
{
public MyServiceObject(MyDataObject myDataObject,
bool includeNested = true)
{
Id = myDataObject.Id;
SomeProperty = myDataObject.SomeProperty;
NestedServiceObjectId = myDataObject.NestedDataObjectId;
if (includeNested)
NestedServiceObject = new NestedServiceObject(myDataObject.NestedDataObject,
includeNested);
}
}
其中工程确定,但现在我有一个问题,我的模拟对于我的单元测试分贝范围内,因为我有对象和ID添加到每个模拟DbSet
,我改变了我的服务代码使用NestedObjectId
属性,而不是NestedObject.Id
财产
所以我想知道如果我访问的唯一虚拟属性是Id字段,如果它仍然会对整个对象进行数据库调用。像
if (includeNested)
{
NestedServiceObject = new NestedServiceObject(myDataObject.NestedDataObject);
}
else
{
NestedServiceObject = new NestedServiceObject(myDataObject.NestedDataObject.Id);
}
这事就解决了我的问题,我的嘲笑,作为服务代码将始终参考NestedObject.Id
财产,我很可能最终会做这个不管是什么易于编程和maintainabilty的,但我好奇这是否是正确的方法。
将您的虚拟属性更改为:public virtual Lazy NestedDataObject {get;组; }那么只有在访问属性时才会加载它。 –
您需要数据实体和域(服务)实体之间的映射层。 –
由于提出这个问题,我得出的结论是,所有相关的对象应该明确声明外键,并且嘲笑数据库上下文不是正确的测试方式。而是使用一个非常简单的存储库层,并使用服务层中的所有逻辑进行模拟。 –