gpt4 book ai didi

c# - 首先使用实体​​框架代码获取外键值

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:21 26 4
gpt4 key购买 nike

我有两种模型,一种用于设备类型,另一种用于设备问题。这里的关系是一个(DeviceType)到多个(DeviceIssues)。以下是模型:

public class DeviceType : ModelBase
{
public string Manufacture { get; set; }
public DeviceTypes Type { get; set; }
public string Model { get; set; }

public virtual ICollection<DeviceIssue> Issues { get; set; }
}

public class DeviceIssue : ModelBase
{
public string Description { get; set; }
public decimal RepairCost { get; set; }

public int DeviceTypeId { get; set; }
public virtual DeviceType DeviceType { get; set; }
}

public abstract class ModelBase
{
public int Id { get; set; }
public Guid Guid { get; set; }
public DateTime FirstCreated { get; set; }
public string LastUpdateUser { get; set; }
public DateTime LastUpdateDt { get; set; }
public bool IsDeleted { get; set; }
}

我必须使用种子方法在数据库中填充多个实体,并且它们的外键完好无损。但是,当我获得设备类型列表时,我并没有获得每个设备的相关问题列表。但是,我正在使用 AutoMapper,而调试存储查询结果的变量也不显示数据。这是我用来调用电话的代码:

var result = new List<DeviceTypeDataContract>();
using (var context = new DSPEntities())
{
var devices = context.DeviceTypes;
foreach (var device in devices)
{
//var issues = context.DeviceIssues.Where(i => i.DeviceTypeId == device.Id).ToList();

var devi = Mapper.Map<DeviceType, DeviceTypeDataContract>(device);
result.Add(devi);
}
}

现在如前所述,在调试时,检查 foreach(var device in devices) 中的变量 device,每次都会显示以下类似结果:

device.Issues = null,
device.manufacture = "Apple",
device.Model = "iPhone 3S",
device.Type = DeviceTypes.SmartPhone,

如果您注意到我的代码中有一行代码被注释掉了。这是评论,因为它抛出以下内部异常:

{"There is already an open DataReader associated with this Command which must be closed first."}

不过,我不知道这是否与我的具体问题有关。

我的问题是,如何从这些关系中检索数据?

注意:关系确实存在,因为在 foreach 语句之外,调用了以下内容:

var issues = context.DeviceIssues.Where(i => i.DeviceTypeId == 1).ToList();

给出以下结果:

issues[6].Description = "Water Damage",
issues[6].RepairCost = 0.00,
issues[6].DeviceTypeId = 1,
issues[6].DeviceType = [+]{Data.Model.DeviceType},
// The last property holds values similar to above.
// Except now the list of issues is populated.

请注意上面的评论:“除了现在问题列表已填充。”

最佳答案

当你用 virtual 修饰关联时,你会推断它们是 lazy loaded .这意味着主要集合(在本例中为 DeviceTypes)已加载,但在您尝试访问它之前,Issues 不会填充任何信息。

有多种方法可以解决这个问题,但最简单(也是最有效)的方法是在需要时使用 Include 方法加载关联。例如

var devices = context.DeviceTypes.Include(x => x.Issues);

这将加载原始集合 (DeviceTypes) 并为每种类型填充 Issues。这通常是最好的方法,因为您只是在需要时获取完成工作单元所需的信息。

但是,如果您发现这种情况很常见,您始终可以在 DbContext 构造函数中调整延迟加载:

public DSPEntities()
{
this.Configuration.LazyLoadingEnabled = false;
}

关于c# - 首先使用实体​​框架代码获取外键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18510863/

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