gpt4 book ai didi

c# - Id 属性的 Entity Framework 虚拟属性和数据库访问?

转载 作者:行者123 更新时间:2023-11-30 12:42:37 25 4
gpt4 key购买 nike

我正在处理的项目中有很多相互关联的实体,我正在使用 WCF 在多个客户端应用程序中使用它们。我很快意识到我在每次调用时序列化了数据库中一半的数据。我解决了眼前的问题,但系统仍在进行大量数据库调用,因为我的服务层对象在其构造函数中遍历了数据层中的所有嵌套对象。很多时候这是完全没有必要的,所以我开始考虑替代方案。

如果我指定嵌套属性的 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 属性,无论如何为了便于编码和维护,我最终可能会这样做,但我很好奇这是否是正确的方法。

最佳答案

你可以使用包含

.Include(x => x.myDataObject.SomeProperty) 

关于c# - Id 属性的 Entity Framework 虚拟属性和数据库访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32991875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com